从 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&lt;T&gt; 包装起来,当您调用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 [重复]

文本过滤后从 Android ListView/ArrayAdapter 中删除项目不起作用

使用按钮删除 Listview w/ArrayAdapter 中的选定项目