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而不是SimpleAdapterArrayList
是一个具体的类,而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();
}
});
}
}