Android ListView с элементами onClick
Я новый программист и новичок в Android. Я использую этот пример http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/, и он отлично работает.
Теперь я хочу, чтобы элементы (Dell, Samsung Galaxy S3 и т.д.) вызывали функцию для открытия нового действия с различной информацией.
Например:
Если я коснусь Dell, новое мероприятие должно показать мне информацию о Dell. Если я коснусь Samsung, то же самое.
I Googled, но не нашел ничего полезного, никакого намека? Я думаю, что это принципиально, но я новичок, поэтому я не знаю, с чего начать
Ответы
Ответ 1
В вашей деятельности, где вы определили свой список
вы пишете
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?>adapter,View v, int position){
ItemClicked item = adapter.getItemAtPosition(position);
Intent intent = new Intent(Activity.this,destinationActivity.class);
//based on item add info to intent
startActivity(intent);
}
});
в вашем адаптере getItem вы пишете
public ItemClicked getItem(int position){
return items.get(position);
}
Ответ 2
Вы начинаете новые действия с намерениями. Один из методов отправки данных в намерение - это передать класс, который реализуется в намерении. Обратите внимание, что вы передаете копию класса.
http://developer.android.com/reference/android/os/Parcelable.html
Здесь у меня есть onItemClick. Я создаю умысел и putExtra целый класс в намерении. Класс, который я отправляю, реализован. Совет. Вам нужно всего лишь реализовать синтаксический анализ над тем, что минимально необходимо для воссоздания класса. Т.е. возможно, имя файла или что-то простое, как строка, что конструктор может использовать для создания класса. Новая активность может позже getExtras и по существу создает копию класса с его конструкторским методом.
Здесь я запускаю класс kmlreader мое приложение, когда получаю onclick в списке.
Примечание: ниже summary - это список класса, который я передаю, поэтому get (position) возвращает значение infact класса, это тот же список, который заполняет listview
List<KmlSummary> summary = null;
...
public final static String EXTRA_KMLSUMMARY = "com.gosylvester.bestrides.util.KmlSummary";
...
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
lastshownitem = position;
Intent intent = new Intent(context, KmlReader.class);
intent.putExtra(ImageTextListViewActivity.EXTRA_KMLSUMMARY,
summary.get(position));
startActivity(intent);
}
позже в новом действии я вытаскиваю класс синтаксического анализа с помощью
kmlSummary = intent.getExtras().getParcelable(
ImageTextListViewActivity.EXTRA_KMLSUMMARY);
//note:
//KmlSummary implements parcelable.
//there is a constructor method for parcel in
// and a overridden writetoparcel method
// these are really easy to setup.
public KmlSummary(Parcel in) {
this._id = in.readInt();
this._description = in.readString();
this._name = in.readString();
this.set_bounds(in.readDouble(), in.readDouble(), in.readDouble(),
in.readDouble());
this._resrawid = in.readInt();
this._resdrawableid = in.readInt();
this._pathstring = in.readString();
String s = in.readString();
this.set_isThumbCreated(Boolean.parseBoolean(s));
}
@Override
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeInt(this._id);
arg0.writeString(this._description);
arg0.writeString(this._name);
arg0.writeDouble(this.get_bounds().southwest.latitude);
arg0.writeDouble(this.get_bounds().southwest.longitude);
arg0.writeDouble(this.get_bounds().northeast.latitude);
arg0.writeDouble(this.get_bounds().northeast.longitude);
arg0.writeInt(this._resrawid);
arg0.writeInt(this._resdrawableid);
arg0.writeString(this.get_pathstring());
String s = Boolean.toString(this.isThumbCreated());
arg0.writeString(s);
}
Удачи
Danny117
Ответ 3
Вы должны обязательно расширить ArrayListAdapter
и реализовать это в своем методе getView()
. Второй параметр (a View
) должен быть завышен, если его значение равно null
, воспользуйтесь им и установите его onClickListener()
сразу после раздувания.
Предполагая, что ваш второй параметр getView()
называется convertView
:
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(final View v) {
if (isSamsung) {
final Intent intent = new Intent(this, SamsungInfo.class);
startActivity(intent);
}
else if (...) {
...
}
}
}
Если вам нужна информация о расширении ArrayListAdapter
, я рекомендую эту ссылку .
Ответ 4
в вашем onitemClick
вы отправите выбранное значение, например deal
, и отправьте его в своем намерении при открытии нового действия и в своем новом действии получите отправленные данные и связанные с выбранным элементом ваши данные
чтобы получить имя из list
String item = yourData.get(position).getName();
чтобы установить данные в намерении
intent.putExtra("Key", item);
чтобы получить данные во второй активности
getIntent().getExtras().getString("Key")
Ответ 5
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getActivity(), DiscussAddValu.class);
startActivity(i);
}
});
Ответ 6
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?>adapter,View v, int position){
Intent intent;
switch(position){
case 0:
intent = new Intent(Activity.this,firstActivity.class);
break;
case 1:
intent = new Intent(Activity.this,secondActivity.class);
break;
case 2:
intent = new Intent(Activity.this,thirdActivity.class);
break;
//add more if you have more items in listview
//0 is the first item 1 second and so on...
}
startActivity(intent);
}
});
Ответ 7
для какого ад реализует Parcelable?
он переходит к адаптеру String [], поэтому
- получить элемент (String) в позиции
- создать намерение
- добавьте его как дополнительную
- начать деятельность
- в действии получить дополнительные
чтобы сохранить список продуктов, которые вы можете использовать здесь. HashMap
(например, как объект STATIC)
примерный класс, описывающий продукт:
public class Product {
private String _name;
private String _description;
private int _id
public Product(String name, String description,int id) {
_name = name;
_desctription = description;
_id = id;
}
public String getName() {
return _name;
}
public String getDescription() {
return _description;
}
}
Product dell = new Product("dell","this is dell",1);
HashMap<String,Product> _hashMap = new HashMap<>();
_hashMap.put(dell.getName(),dell);
затем перейдите к набору ключей адаптера как:
String[] productNames = _hashMap.keySet().toArray(new String[_hashMap.size()]);
когда в интерфейсе u вернется просмотр u set listener, например:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Context context = parent.getContext();
String itemName = getItem(position)
someView.setOnClikListener(new MyOnClickListener(context, itemName));
}
private class MyOnClickListener implements View.OnClickListener {
private String _itemName;
private Context _context
public MyOnClickListener(Context context, String itemName) {
_context = context;
_itemName = itemName;
}
@Override
public void onClick(View view) {
//------listener onClick example method body ------
Intent intent = new Intent(_context, SomeClassToHandleData.class);
intent.putExtra(key_to_product_name,_itemName);
_context.startActivity(intent);
}
}
то в другой деятельности:
@Override
public void onCreate(Bundle) {
String productName = getIntent().getExtra(key_to_product_name);
Product product = _hashMap.get(productName);
}
* key_to_product_name является общедоступной статической строкой, которая служит ключом для дополнительных
пс. извините за опечатку, я спешил:)
ps2. это поможет вам понять, как это сделать
ps3. когда у меня будет больше времени, я добавлю подробное описание
МОЙ КОММЕНТАРИЙ:
- НЕ ИСПОЛЬЗУЙТЕ ЛЮБЫЕ ЗАЯВЛЕНИЯ SWITCH
- НЕ СОЗДАТЬ ОТДЕЛЬНЫЕ МЕРОПРИЯТИЯ ДЛЯ КАЖДОГО ПРОДУКТА (ТО НУЖНО ТОЛЬКО ОДИН)
Ответ 8
Мне удалось обойти все это, заменив ссылку на контекст от this
или Context.this
на getapplicationcontext
.
Ответ 9
listview.setOnItemClickListener(new OnItemClickListener(){
//setting onclick to items in the listview.
@Override
public void onItemClick(AdapterView<?>adapter,View v, int position){
Intent intent;
switch(position){
// case 0 is the first item in the listView.
case 0:
intent = new Intent(Activity.this,firstActivity.class);
break;
//case 1 is the second item in the listView.
case 1:
intent = new Intent(Activity.this,secondActivity.class);
break;
case 2:
intent = new Intent(Activity.this,thirdActivity.class);
break;
//add more if you have more items in listView
startActivity(intent);
}
});
Ответ 10
**
Основная деятельность
**
**
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView1 = (ListView) findViewById(R.id.listView1);
Product[] items = {
new Product(1, "Milk", 21.50),
new Product(2, "Butter", 15.99),
new Product(3, "Yogurt", 14.90),
new Product(4, "Toothpaste", 7.99),
new Product(5, "Ice Cream", 10.00),
};
ArrayAdapter<Product> adapter = new ArrayAdapter<Product>(this,
android.R.layout.simple_list_item_1, items);
listView1.setAdapter(adapter);
listView1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String item = ((TextView)view).getText().toString();
Toast.makeText(getBaseContext(), item, Toast.LENGTH_LONG).show();
}
});
}
}