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

Android 如何在单击按钮时从ListView中动态删除项目?,android,listview,Android,Listview,我正在开发一个应用程序,它需要从按钮事件的列表视图中删除项目 我试图将其从ArrayList中删除,并创建整个新适配器,然后再次加载列表。由于我的列表很大,这样做会影响我的应用程序的性能。因此,我想知道是否有其他方法可以动态地从列表中删除项目 编辑:我试过你说的话 当我删除一个项目时,它工作得非常好,但随着我增加所选项目的数量,它开始给我IndexOutOfBoundException 这是我的密码: public void onClick(View view) { SparseBool

我正在开发一个应用程序,它需要从按钮事件的
列表视图中删除项目

我试图将其从
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{}
}
public void onClick(视图)
{
SparseBooleanArray checkedPositions=新SparseBooleanArray();
选中位置。清除();
checkedPositions=lv.getCheckEditePositions();
int size=checkedPositions.size();
如果(大小!=0)
{

对于(int i=0;i您只需使用
ArrayAdapter
remove()
方法从列表中删除所需的项即可

arrayList.remove([INDEX]);
arrayAdapter.notifyDataSetChanged();
一种可能的方法是:

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

arrayList.remove([INDEX]);
arrayAdapter.notifyDataSetChanged();
或者你可以再打一次

setListAdapter(adapter)

在列表上有一个按钮,并让它在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();
    }

}
public void onclick按钮(视图V){
最终int位置=listView.getPositionForView(V);
System.out.println(“所选职位为:+职位”);
删除(职位);
}
公共无效删除(整数位置){
if(adapter.getCount()>0){
//Log.d(“最大编号为“,”+最大项目编号);
//删除最新的1减去1
comment=(GenrricStoring)adapter.getItem(位置);
//Log.d(“删除项为:,”“+注释”);
dbconnection.deleteComment(comment);
列表值=dbconnection.getAllComments();
//更新屏幕上的内容
this.adapter=新的UserItemAdapter(this,android.R.layout.simple\u list\u item\u 1,值);
setAdapter(适配器);
}
其他的
{
int duration=Toast.LENGTH\u SHORT;
//因为在列表中没有显示任何内容
Toast Toast=Toast.makeText(getApplicationContext(),“Db为空”,持续时间);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
}
}

这对我来说很有效。希望对别人有所帮助。:)


并创建事件项_delete _handler,

列表项;
专用阵列适配器类别适配器;
//您的条目列表{Example:}
entries=newarraylist();
categoryAdapter=新阵列适配器(ViewBeaconsActivity.this,
android.R.layout.simple_list_item_1,条目);
//从列表中删除该特定类别
条目。删除(categoryName);
//通知适配器您的数据集已更改。
categoryAdapter.notifyDataSetChanged();

您可以从列表视图中删除项目,如下所示: 或者,您可以在按钮事件中选择要删除的项目

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();
  }
}
public类活动{
专用阵列适配器;
私有列表列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_第三);
字符串[]值=新字符串[]{“Android”、“iPhone”、“WindowsMobile”,
“黑莓”、“WebOS”、“Ubuntu”、“Windows7”、“Max OS X”,
“Linux”、“OS/2”};
liste=newarraylist();
Collections.addAll(列表、值);
适配器=新阵列适配器(此,
android.R.layout.simple_list_item_1,liste);
setListAdapter(适配器);
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
列表。删除(位置);
adapter.notifyDataSetChanged();
}
}

关于你的最后一个问题,下面是一个简单的例子:

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

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

private List datavalue=new ArrayList;
      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();
            }
        });
    }
    }
@凌驾 公共视图getView(内部位置、视图视图、视图组视图组){ view.setOnClickListener(新的view.OnClickListener(){ @凌驾 公共void onClick(视图){ 数据值。删除(位置); notifyDataSetChanged(); } }); } }
您必须添加arrayAdapter.notifyDataSetChanged()如果你直接使用
ArrayAdapter
你不必这么做,但是如果你使用
ArrayList
你必须这么做。不幸的是,我使用的是SimpleAdapter而不是ArrayAdapter。那么有没有办法像上面提到的那样从SimpleAdapter中删除项?或者我需要使用ArrayAdapter而不是SimpleAdapter
ArrayList
是一个具体的类,而
List
是接口。你不能实例化
List
,只能实例化一个实现它的类型。我很确定你使用的是
ArrayList
。第一种方法只能删除最后一项,为什么?他为什么要在
getView()
方法中这样做?(不一定)如果他想在某个位置移除物品,或者如果他想在某个位置静态移除物品,他可以在任何地方使用。我想你接到电话了
 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();
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();
  }
}
      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();
            }
        });
    }
    }