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();
}
从你上面的代码我注意到两件事-
每当您添加新项目时,调用 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()
将更新列表的项目。
大家好 :) 我动态创建 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();
}
从你上面的代码我注意到两件事-
每当您添加新项目时,调用 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()
将更新列表的项目。