Android:如何从listView和arrayAdapter中删除一个项目

16

我有一个ArrayList中的项目集合。我将它们添加到一个客户适配器中,如下所示:

this.m_adapter = new MyAdapter(this, R.layout.myitem,
    itemCart.m_items);

我有一个列表中的每个项目都有一个删除按钮,但我不确定如何将删除按钮的onClick()与ArrayList中的原始项目连接起来。请问有人可以解释一下如何做到这一点,或者指点我去哪里可以阅读有关此问题的教程吗?非讽刺/非轻蔑的回复将不胜感激。

9个回答

30
你可以在你的ArrayList上调用remove()方法。
itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();

接着你需要在适配器上调用notifyDataSetChanged();来更新ListView


是的,但我的问题是如何指定该项的索引?我认为我需要最初使用setTag(),然后在删除之前使用getTag(),但如果可能的话,我想看一些示例代码。再次感谢。 - gonzobrains
我在ListView上有一个上下文菜单,其中包含一个删除按钮,我使用的是类似于item.getMenuInfo().id的方式获取元素(这并不简单)。但是您的按钮肯定有索引。 - jcuenod

7

这是我目前的解决方案:

getView() 方法中,我做了如下操作:

deleteButton.setTag(position);

看起来getTag()返回一个对象。因此,我首先将位置int转换为Integer对象。它看起来正在工作。

OnClickListener()中,我执行以下操作:

items.remove(index.intValue());

到目前为止,一切都很好。

那么,如果没有标签,你就不知道哪个按钮被点击了?在我看来,你可能忽略了一些找出答案的机制。考虑使用按钮的父级元素。 - jcuenod

7

您可以通过注意到列表视图是一个子视图的集合(列表的行)来简单地获取元素的索引。

您可以在代码中执行以下操作:

(例如,在getView()方法中)

row.setOnLongClickListener(new OnLongClickListener() 
{
    @Override
    public boolean onLongClick(View view) {
        remove(listView.indexOfChild(view));
        return true;
    }
}

换言之,解决方案就是使用indexOfChild(View)方法获取用户(长按)按下的子视图的索引。

解决方案适用于Xamarin。 - andreikashin

4

以下方式适用于我:

/* 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();

1
这是我的代码。
  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;
        }
}

1
移除(删除)位置:
mainAdapter.remove(mainAdapter.getItem(position));

例如最后一个:
mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));

1

尝试这些代码行,对我非常有帮助

holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            list.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, list.size());
        }
    });

0

看起来你可以通过以下方式获取ListView中被点击项的索引(或位置):

listview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        listview.remove(listview.getItem(position).toString());
    }
}

所以你需要监听视图上的点击事件,然后从中获取索引。


0

如果您使用上下文菜单,则可以获得 AdapterContextMenuInfo,该结构提供了所点击元素的索引和 ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接