【问题标题】:Android: how to remove an item from a listView and arrayAdapterAndroid:如何从 listView 和 arrayAdapter 中删除项目
【发布时间】:2011-06-09 13:29:36
【问题描述】:

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

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

我的列表中的每个项目都有一个删除按钮,但我不确定如何将删除按钮的onClick() 与 ArrayList 中的原始项目连接起来。有人可以解释一下如何做到这一点或指向我可以阅读的教程吗?非常感谢非讽刺/非居高临下的回应。

【问题讨论】:

    标签: android listview 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());
                      }
                  });
              

              【讨论】:

                猜你喜欢
                • 2010-11-22
                • 1970-01-01
                • 1970-01-01
                • 2016-12-03
                • 2015-06-02
                • 1970-01-01
                • 1970-01-01
                • 2013-08-28
                相关资源
                最近更新 更多