如何在按钮单击时动态删除ListView中的项目?

时间:2011-03-31 09:14:03

标签: android listview

我正在开发一款需要在按钮事件中从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对象的引用。

9 个答案:

答案 0 :(得分:49)

您只需使用remove()的{​​{1}}方法从列表中删除所需的项目。

可能的方法是:

ArrayAdapter

另一种方法是修改Object toRemove = arrayAdapter.getItem([POSITION]); arrayAdapter.remove(toRemove); 并在ArrayList上调用notifyDataSetChanged()

ArrayAdapter

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

adapter.remove(arraylist.get(position));
adapter.notifyDataSetChanged();

或者你可以再打电话

setListAdapter(adapter)

答案 3 :(得分:2)

在列表上有一个按钮,让它在xml中点击功能就像先获取位置一样

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();
    }

}

答案 4 :(得分:1)

      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();
            }
        });
    }
    }

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您可以从列表视图中删除项目,如下所示: 或者您可以选择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();
  }
}

答案 7 :(得分:0)

关于你的上一个问题,这里用一个简单的例子说明问题:

我们说您的列表包含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处的元素,但该列表仅包含三个元素,因此您将获得超出范围的异常。

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

答案 8 :(得分:-1)

<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