我正在制作一种大型应用程序,它主要包含3个活动和ListView组件。
MainActivity - > FirstActivity并返回
MainActivity - > SecondActivty并返回
这三个人都有ListView组件,列出了他们特定的列表视图项。
我有一个名为MyMachine的Singleton类,它包含所有属性 里面的机器和其中一些是主要的计算 活动已创建。
我想要实现的目标这里列出了Main,First和Second活动中机器的所有相关属性。它就像在3组中对同一事物的属性进行分类。
我遇到的问题是:
我希望每个ListView项上都有一个click事件。但是监听器给了我ListView项的整数键,这意味着机器的每个属性都需要用某个整数键映射。但是,如果FirstActivity的第1项是Main活动的第0项,则单击时会打印错误的值。
有更好的方法吗?
基本上,当在所有活动中单击ListView项时,如何映射字符串值并在对话框窗口中正确显示它们。我可以为这个目的开发函数,但是有一个更简单的方法:)
答案 0 :(得分:1)
ListView
使用Adapter
显示数据(通常使用BaseAdapter
,SimpleAdapter
或ArrayAdapter
等其中一种实现。
Adapter
类保存对要显示的项的引用,并且还有一个特殊方法getItemId(int position)
,它必须返回ListView中某个位置的项的ID。
所以,假设我们有Item类:
public class Property{
public final long id;
public final String name;
public final long price;
public Property(long id, String name, long price){
this.id = id;
this.name = name;
this.price = price;
}
}
映射到某些数据库记录:
| _id | name | price |
|-----|------|-------|
| 1 | abcd | 123 |
| 2 | efgh | 456 |
然后,我们可以使用ArrayAdpater
在Property
中显示一组ListView
项:
public class PropertyAdapter extends ArrayAdapter<Property>{
public PropertyAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
@Override
public long getItemId(int position) {
return getItem(position).id;
}
}
你可以获得项目的ID:
ListView listView = <some list view>;
PropertyAdapter propertyAdapter = < adapter for list view >;
listView.setAdapter(propertyAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
int itemId = propertyAdapter.getItemId(i);
//-- this item Id is same as returned by getItemId(),
//-- which is id field of Property class
//-- which is id column in database
}
});