【问题标题】:How to dynamically remove items from ListView on a button click?如何在单击按钮时从 ListView 中动态删除项目?
【发布时间】:2011-03-31 09:14:03
【问题描述】:

我正在开发一个应用程序,该应用程序需要在按钮事件上从 ListView 中删除项目。

我试图从ArrayList 中删除它并创建全新的适配器并再次加载列表。由于我的列表很大,这样做会影响我的应用程序的性能。所以我想知道是否有任何其他方法可以动态地从我的列表中删除一个项目。

编辑:我试过你说的。

当我删除一个项目时它工作得很好,但是当我增加所选项目的数量时它开始给我 IndexOutOfBoundException。

这是我的代码:

public void onClick(View view)
{
    SparseBooleanArray checkedPositions = new SparseBooleanArray();
    checkedPositions.clear();
    checkedPositions = lv.getCheckedItemPositions();
    int size = checkedPositions.size();
    if(size != 0)
    {

        for(int i = 0; i <= size; i++)
        {
            if(checkedPositions.valueAt(i))
            {
                list.remove(notes.getItem(checkedPositions.keyAt(i)));
                notes.notifyDataSetChanged();
            }
        }
    }
        else{}
}

这里,notes 是对 SimpleAdapter 对象的引用。

【问题讨论】:

    标签: android listview


    【解决方案1】:

    您只需使用ArrayAdapterremove() 方法从列表中删除所需的项目。

    一种可能的方法是:

    Object toRemove = arrayAdapter.getItem([POSITION]);
    arrayAdapter.remove(toRemove);
    

    另一种方法是修改ArrayList 并在ArrayAdapter 上调用notifyDataSetChanged()

    arrayList.remove([INDEX]);
    arrayAdapter.notifyDataSetChanged();
    

    【讨论】:

    • 你必须添加arrayAdapter.notifyDataSetChanged()
    • 好吧,如果您直接使用ArrayAdapter,则不必这样做,但如果您使用ArrayList,则必须这样做。
    • 不幸的是,我使用的是 SimpleAdapter 而不是 ArrayadAdapter。那么有什么方法可以像你上面提到的那样从 SimpleAdapter 中删除项目吗?还是我需要使用 SimpleAdapter 的 ArrayAdapter?
    • ArrayList 是一个具体的类,而List 是接口。您不能实例化 List,而只能实例化一个实现它的类型。我很确定您正在使用ArrayList
    • 第一种方式只能删除最后一项,为什么?
    【解决方案2】:

    这对我有用。希望它可以帮助某人。 :)

    SimpleAdapter adapter = (SimpleAdapter) getListAdapter();
    this.resultsList.remove((int) info.id);
    adapter.notifyDataSetChanged();
    

    【讨论】:

      【解决方案3】:
      adapter.remove(arraylist.get(position));
      adapter.notifyDataSetChanged();
      

      或者你可以再打电话

      setListAdapter(adapter)
      

      【讨论】:

      • 他为什么要在getView()方法中这样做?
      • (不是必须的)如果他想在位置移除项目..或者如果他想静态移除他可以在任何地方使用..
      • 我想你现在动态和静态混淆了。
      【解决方案4】:

      在列表上有一个按钮,让它在 xml 中的 onclick 功能喜欢首先获得位置

      public void OnClickButton(View V){
        final int postion = listView.getPositionForView(V);
          System.out.println("postion selected is : "+postion);
      Delete(postion);
      
      }
      public void Delete(int position){
          if (adapter.getCount() > 0) {
      
              //Log.d("largest no is",""+largestitemno);
              //deleting the latest added by subtracting one 1 
              comment = (GenrricStoring) adapter.getItem(position);
              //Log.d("Deleting item is: ",""+comment);
              dbconnection.deleteComment(comment);
              List<GenrricStoring> values = dbconnection.getAllComments();
              //updating the content on the screen
              this.adapter = new UserItemAdapter(this, android.R.layout.simple_list_item_1, values);
              listView.setAdapter(adapter);
          }
          else
          {
              int duration = Toast.LENGTH_SHORT;
              //for showing nothing is left in the list
              Toast toast = Toast.makeText(getApplicationContext(),"Db is empty", duration);
              toast.setGravity(Gravity.CENTER, 0, 0);
      
              toast.show();
          }
      
      }
      

      【讨论】:

        【解决方案5】:
              private List<DataValue> datavalue=new ArrayList<Datavalue>;
        
             @Override
            public View getView(int position, View view, ViewGroup viewGroup) {
        
                    view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
        
                        datavalue.remove(position);
                        notifyDataSetChanged();
                    }
                });
            }
            }
        

        【讨论】:

          【解决方案6】:
           List<String> entries;
           private ArrayAdapter<String> categoryAdapter;
           //Your list of entries {Example: <"category1","category2","category3">}
           entries =  new ArrayList<String>();
           categoryAdapter = new ArrayAdapter<String>(ViewBeaconsActivity.this,
                                             android.R.layout.simple_list_item_1, entries);
           //Remove that specific category from the list
           entries.remove(categoryName);
           //Notify the adapter that your dataset has changed.
           categoryAdapter.notifyDataSetChanged();
          

          【讨论】:

            【解决方案7】:

            您可以像这样从列表视图中删除项目: 或者您可以在您的 Button 事件中选择必须删除的项目

            public class Third extends ListActivity {
            private ArrayAdapter<String> adapter;
            private List<String> liste;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_third);
                 String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                            "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                            "Linux", "OS/2" };
                 liste = new ArrayList<String>();
                 Collections.addAll(liste, values);
                 adapter = new ArrayAdapter<String>(this,
                            android.R.layout.simple_list_item_1, liste);
                 setListAdapter(adapter);
            }
             @Override
              protected void onListItemClick(ListView l, View v, int position, long id) {
                 liste.remove(position);
                 adapter.notifyDataSetChanged();
              }
            }
            

            【讨论】:

              【解决方案8】:

              至于你的最后一个问题,这里用一个简单的例子来说明问题:

              假设您的列表包含 5 个元素:list = [1, 2, 3, 4, 5],而您要删除的项目列表(即索引)是 indices_to_remove = [0, 2, 4]。在循环的第一次迭代中,您删除索引 0 处的项目,因此您的列表变为list = [2, 3, 4, 5]。在第二次迭代中,您删除了索引 2 处的项目,因此您的列表变为 list = [2, 3, 5](如您所见,这删除了错误的元素)。最后,在第三次迭代中,您尝试删除索引 4 处的元素,但列表仅包含三个元素,因此您会遇到越界异常。

              现在您已经了解了问题所在,希望您能够提出解决方案。祝你好运!

              【讨论】:

                【解决方案9】:
                <ImageView
                    android:id="@+id/btnDelete"
                    android:layout_width="35dp"
                    android:layout_height="match_parent"
                    android:layout_alignBottom="@+id/editTipo"
                    android:layout_alignParentRight="true"
                    android:background="@drawable/abc_ic_clear"
                    android:onClick="item_delete_handler"/>
                

                并创建Event item_delete_handler

                【讨论】:

                  猜你喜欢
                  • 2016-05-07
                  • 2013-10-09
                  • 1970-01-01
                  • 2015-02-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-07-29
                  相关资源
                  最近更新 更多