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 中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

如何从android的listview中删除一个项目

如何从 ListView 中删除 Firebase Android 中的特定节点

Android:使用 ListView 和 Service 从应用小部件开始活动

Android Sqlite:如何从 Listview 中获取 SQLite rowId?

如何从android的listview中的不同项目获取数据

如何从我运行到 ListView Android 的命令中显示数据?