Android:如何从 listView 和 arrayAdapter 中删除项目
Posted
技术标签:
【中文标题】Android:如何从 listView 和 arrayAdapter 中删除项目【英文标题】:Android: how to remove an item from a listView and arrayAdapter 【发布时间】:2011-06-09 13:29:36 【问题描述】:我在 ArrayList 中有一组项目。我将它们添加到客户适配器中,如下所示:
this.m_adapter = new MyAdapter(this, R.layout.myitem,
itemCart.m_items);
我的列表中的每个项目都有一个删除按钮,但我不确定如何将删除按钮的onClick()
与 ArrayList 中的原始项目连接起来。有人可以解释一下如何做到这一点或指向我可以阅读的教程吗?非常感谢非讽刺/非居高临下的回应。
【问题讨论】:
【参考方案1】:您可以在您的ArrayList
上调用remove()
方法
itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();
然后你需要在你的适配器上调用notifyDataSetChanged();
来更新ListView
【讨论】:
是的,但我的问题是弄清楚如何为该项目指定索引?我想我需要先使用 setTag() 然后在删除之前使用 getTag() 但如果可能的话我想看看一些示例代码。再次感谢。 我在 ListView 上有一个带有删除按钮的上下文菜单,我使用基本上是item.getMenuInfo().id
的东西来获取元素(这不是那么简单)。当然你的按钮有索引。【参考方案2】:
到目前为止,这是我的解决方案:
在getView()
方法中,我执行以下操作:
deleteButton.setTag(position);
看起来getTag()
返回一个对象。所以我首先将位置 int 转换为 Integer 对象。它似乎正在工作。
在OnClickListener()
中,我执行以下操作:
items.remove(index.intValue());
到目前为止,一切都很好。
【讨论】:
所以没有标签 - 你不知道点击了哪个按钮?在我看来,你忽略了一些解决这个问题的机制。考虑使用按钮的父级。【参考方案3】:如果你使用上下文菜单,那么你可以得到 AdapterContextMenuInfo,这个结构给出了被点击元素的索引和id。
【讨论】:
【参考方案4】:您可以通过简单地注意到列表视图是子视图(列表的行)的集合来获取元素的索引。
你可以在你的代码中做这样的事情:
(例如在 getView() 方法内部)
row.setOnLongClickListener(new OnLongClickListener()
@Override
public boolean onLongClick(View view)
remove(listView.indexOfChild(view));
return true;
也就是说,解决方案是简单地使用 indexOfChild(View) 方法来获取用户(长)按下的子视图的索引。
【讨论】:
同样适用于 Xamarin 的解决方案【参考方案5】:这是我的代码。
transfer.setItemPosition(position, items.get(position).getAddMode());
这里的调用是主类的实例。每次我单击删除按钮时,它都会传递该项目在此行列表中的位置。
public View getView(final int position, View convertView, ViewGroup parent)
View v = convertView;
if (v == null)
final Context context = getContext();
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.listviewitem_layout, null);
ItemEntry item = items.get(position);
if (item != null)
TextView textViewName = (TextView) v.findViewById(R.id.textViewItemName);
ImageView imageViewDelete = (ImageView) v.findViewById(R.id.imageViewDeleteIcon);
imageViewDelete.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
transfer.showDialog(4);
transfer.setItemPosition(position, items.get(position).getAddMode());
);
if (textViewName != null)
textViewName.setText(item.getItemName());
if(imageViewDelete != null)
imageViewDelete.setImageResource(R.drawable.delete);
return v;
【讨论】:
【参考方案6】:以下作品适合我:
/* Read values from resource into an array */
String[] strColorValues = getResources().getStringArray(R.array.colors);
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < strColorValues.length; i++)
list.add(strColorValues[i]);
ArrayAdapter adapterColors = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_item, list);
adapterColors.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerColors.setAdapter(adapterPermissionLevels);
spinnerColors.setOnItemSelectedListener(this);
/* Remove first element from the adapter and notify dataset changed. */
String item = spinnerColors.getItemAtPosition(0).toString();
adapterColors.remove(item);
adapterColors.notifyDataSetChanged();
【讨论】:
【参考方案7】:看来你可以在ListView中获取点击项的索引(或位置)如下:
listview.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
listview.remove(listview.getItem(position).toString());
所以你需要监听 Views 的点击,然后从中获取索引。
【讨论】:
【参考方案8】:按位置删除:
mainAdapter.remove(mainAdapter.getItem(position));
如最后一个:
mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
【讨论】:
【参考方案9】:试试这些对我很有帮助的代码行
holder.image.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
list.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, list.size());
);
【讨论】:
以上是关于Android:如何从 listView 和 arrayAdapter 中删除项目的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ListView 中删除 Firebase Android 中的特定节点
Android:使用 ListView 和 Service 从应用小部件开始活动