0

我正在制作一种大型应用程序,它主要由 3 个活动和其中的 ListView 组件组成。

MainActivity -> FirstActivity 并返回

MainActivity -> SecondActivity 并返回

这三个都有 ListView 组件,其中列出了它们的特定列表视图项。

我有一个名为 MyMachine 的 Singleton 类,其中包含机器的所有属性,其中一些属性是在创建主要活动时计算的。

在这里要实现的是在 Main、First 和 Second 活动中列出机器的所有相关属性。就像将同一事物的属性分为 3 组一样。

我面临的问题是:

我想要每个 ListView 项目上的点击事件。但是监听器给了我 ListView 项的整数键,这意味着机器的每个属性都需要映射到某个整数键。但是,如果 FirstActivity 的第 1 项是主要活动的第 0 项,则单击时会打印错误的值。

有一个更好的方法吗?

基本上,当在所有活动中单击 ListView 项目时,如何映射字符串值并在对话框窗口中正确显示它们。我可以为此目的开发功能,但有没有更简单的方法:)

4

1 回答 1

1

ListView显示数据使用Adapter(通常使用的实现之一BaseAdapterSimpleAdapterArrayAdapter使用)。

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  |

然后我们可以使用 anArrayAdpater来显示 a 中的一组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
        }
  });
于 2013-08-01T08:39:26.423 回答