android 动态列表视图中的 setOnItemClickListener

android setOnItemClickListener in dynamic Listview

大家好 :) 我动态创建 Listview。此列表视图根据用户的操作更改项目的灵活性。 但是我的程序有第一个列表的点击事件,即使列表发生变化。每次列表变化时是否需要注册一个新的setOnItemClickListener


我的代码:

创建

final ArrayList<Item> items = setList("all"); //set list item dynamically

VenuesListAdapter adapter = new VenuesListAdapter(getActivity(), items);
mListView.addHeaderView(mHeader);
mListView.setAdapter(adapter);

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        if(position > 1){
            Log.d(getTag(), ""+items.get(position).getText());
        }
    }
});

更改列表时(通常是单击按钮时)

ArrayList<Item> items = setList("barra"); //set list item dynamically
mListView.setAdapter(new VenuesListAdapter(getActivity(), items));

动态添加列表项方法

ArrayList<Item> setList(String type){
    ArrayList<Item> items = new ArrayList<Item>();

    switch (type){
         case "all":
            items.add(new VenuesListHeader("All"));
            items.add(new VenuesListItem("Olympic stadium"));
            items.add(new VenuesListItem("Sambodromo"));
            items.add(new VenuesListItem("Maracana"));
            break;
        case "barra":
            items.add(new VenuesListHeader("Barra"));
            items.add(new VenuesListItem("Olympic gold course"));
            items.add(new VenuesListItem("Pontal"));
            items.add(new VenuesListItem("Barra olympic park"));
            items.add(new VenuesListItem("Riocentro"));
            break;
            .
            .
            .
    }
    return items;
}

尽管调用了setList("barra"),如果点击列表视图中的第一项,打印'all'而不是'barra' .还有另一种方法可以在调用 setAdapter() 时注册 setOnItemClickListener 吗?

根据您提供的代码,我没有看到您有多个 OnItemClickListener 的实现。基本上,当您 select 列表视图中的一个项目时,您只需记录其内容。您不必在每次使用 setList(String type) 时都创建新的适配器。只需替换 setList(String type) 中的列表 ArrayList 项目并调用 adapter.notifyDataSetChanged() 以便列表视图反映更改。

没有。但我认为你可以简单地让项目点击监听器的动作取决于你的 Item 的内容。

我认为解决方案很简单,但我不确定我是否正确解释了你的问题。 所以你有两种项目,根据项目类型,记录内容。我会先 添加 Item

中的类型
class Item {
  ...
  public VenuesListItem venueItem;
  public VenuesListHeader venueHeader;
  public String type;     
}

然后在 OnItemClickListener 中进行管道处理

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   Item it = items.get(position);
   if (it.type.equals("all")){
      ...
   }else if (it.type.equals("barra"){
      ...
   }
}
});

并且您不应该一直在适配器中初始化列表。你应该做的是

void setList(String type){

  // Use the original items reference
  items.clear();

  switch (type){
     case "all":
        items.add(new VenuesListHeader("All"));
        ...
        break;
    case "barra":
        items.add(new VenuesListHeader("Barra"));
        ... 
        break;

  }
  adapter.notifyDataSetChanged();
}

从你上面的代码我注意到两件事-

  1. 每当您添加新项目时,调用 items.clear() 以删除旧值。

  2. 将新项目添加到 ArrayList 项目后而不是调用

    ArrayList items = setList("barra"); //动态设置列表项 mListView.setAdapter(new VenuesListAdapter(getActivity(), items));

通话

ArrayList<Item> items = setList("barra"); //set list item dynamically
adapter.notifyDataSetChanged();

因为适配器已经添加到列表视图调用 adapter.notifyDataSetChanged() 将更新列表的项目。