动态Listview中的android setOnItemClickListener

时间:2015-04-29 02:00:04

标签: android listview dynamic android-listview

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


我的代码:

的onCreate

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”。是否有其他方式在调用setOnItemClickListener时注册setAdapter()

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

没有。但我认为你可以简单地让项目点击监听器的动作取决于你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"){
      ...
   }
}
});

并且您不应该始终在适配器中初始化List。你应该做的是

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();
}

答案 2 :(得分:0)

从上面的代码我发现了两件事 -

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

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

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

  3. 呼叫

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

    由于适配器已添加到列表视图中,因此调用adapter.notifyDataSetChanged()将更新列表中的项目。