大家好:)我动态创建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()
?
答案 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)
从上面的代码我发现了两件事 -
每当您添加新项目时,请调用items.clear()以删除旧值。
将新项添加到ArrayList项而不是调用
ArrayList items = setList(“barra”); //动态设置列表项 mListView.setAdapter(new VenuesListAdapter(getActivity(),items));
呼叫
ArrayList<Item> items = setList("barra"); //set list item dynamically
adapter.notifyDataSetChanged();
由于适配器已添加到列表视图中,因此调用adapter.notifyDataSetChanged()
将更新列表中的项目。