从 ArrayAdapter 中删除项目
Posted
技术标签:
【中文标题】从 ArrayAdapter 中删除项目【英文标题】:Deleting item from ArrayAdapter 【发布时间】:2015-06-02 07:45:59 【问题描述】:我有一个数组:Object[] array
,以及一个扩展 ArrayAdapter<Object>
的数组适配器。
当我尝试使用adapter.remove(Object obj)
从中删除时,我得到一个UnsupportedOperationException
异常,就像this post 一样。
提供的答案建议使用 ArrayList 代替。这不是我的选择。我需要坚持使用数组。所以我将数组复制到另一个数组,但没有我要删除的项目。然后我就这样做了:
oldArray = newArray;
然后调用adapter.notifyDataSetChanged();
。
这很好用,只是它不会刷新屏幕。我需要关闭然后重新打开屏幕以查看更改。 notifyDataSetChanged()
不应该刷新吗?
编辑:
根据@MD 的回答,这就是我现在正在做的事情:
controller.onRemove(id);
public void onRemove(int id)
int userListLength = usersArray.length;
int j = 0;
User[] newUserList = new User[userListLength-1];
for(int i=0; i<userListLength; i++)
if(id != usersArray[i].getId())
newUserList[j] = new User();
newUserList[j] = usersArray[i];
j++;
usersArray = newUserList;
//store in database
//...
view.getAdapter().refresh( usersArray );
public void refresh(User[] items)
this.userArray = items;
notifyDataSetChanged();
适配器构造:
adapter = new myUserAdapter( controller.getBaseContext(), R.layout.user_row, userArrayList);
usersListView.setAdapter( adapter );
在myUserAdapter
我有:
private User[] userArray;
解决方案:
@MD 的回答有效。但我还必须在适配器中覆盖getCount()
:
@Override
public int getCount ()
return userArray.length;
在接受的答案here中有解释。
【问题讨论】:
也许你需要在这里展示你的适配器 还请发布您如何构建ArrayAdapter
再次检查adapter.remove(Object obj)
。这一次你不会得到异常。 userArrayList
真的是 ArrayList
的一个实例,对吧?
为什么不呢?除了调用新的refresh()
函数之外,我没有更改任何内容
如果你用 ArrayList 构造它,add
/remove
将起作用。如果使用数组,它可能会使用只读列表来初始化自己。
【参考方案1】:
我有办法
在您的adapter
中添加刷新方法:
public void refresh(List<String> items)
this.items = items;
notifyDataSetChanged();
并从Activity
打来电话
yourAdapter.refresh(items); // items new arrayList or Array
【讨论】:
以这种方式调用notifyDataSetChanged()
会出现异常:androidRuntime(15393): java.lang.RuntimeException: Unable to start Activity
我认为,在扩展 ArrayAdapter 的类中保留一个额外的 items
字段并不是作者的意思
notifyDataSetChanged()
现在以某种方式给出ArrayIndexOutOfBoundsException
现在可以了!我在我的适配器中覆盖了getCount()
。我会在我的问题中解释一下。【参考方案2】:
ArrayAdapter
只是将您传递给其构造函数的List<T>
包装起来,当您调用remove()
时,它会调用该列表的remove()
方法。
如果您将数组而不是列表传递给构造函数,它会将其转换为 Arrays.asList()
。
/**
* Constructor
*
* @param context The current context.
* @param resource The resource ID for a layout file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
public ArrayAdapter(Context context, int resource, T[] objects)
init(context, resource, 0, Arrays.asList(objects));
在较早的 Android 版本中,Arrays.asList
返回一个只读列表。这就是你得到异常的原因
您必须从您的数组中显式创建一个 ArrayList:
adapter = new myUserAdapter( controller.getBaseContext(), R.layout.user_row, new ArrayList<User>(Arrays.asList(userArrayList)));
【讨论】:
@AlaaM。为什么?你打算修改那个数组吗?适配器无论如何都不会反映更改以上是关于从 ArrayAdapter 中删除项目的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何从 listView 和 arrayAdapter 中删除项目
使用自定义arrayadapter从listview android中删除复选框选择的多个项目
ArrayAdapter 的应用程序崩溃,因为 Array 为空
UnsupportedOperationException with ArrayAdapter.remove [重复]