【问题标题】:Deleting item from ArrayAdapter从 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 将起作用。如果使用数组,它可能会使用只读列表来初始化自己。

标签: java android arrays


【解决方案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。为什么?你打算修改那个数组吗?适配器无论如何都不会反映更改
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2011-06-09
  • 2011-03-29
  • 2013-08-28
  • 1970-01-01
  • 2018-12-07
相关资源
最近更新 更多