从ArrayAdapter中删除项目

时间:2015-03-29 07:45:02

标签: java android arrays

我有一个数组: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中解释。

2 个答案:

答案 0 :(得分:2)

我有办法

adapter中添加刷新方法:

public void refresh(List<String> items)
{
    this.items = items;
    notifyDataSetChanged();
}

并从Activity拨打电话

yourAdapter.refresh(items); // items new arrayList or Array

答案 1 :(得分:0)

ArrayAdapter只需将传递给List<T>的{​​{1}}包裹到其构造函数中,当您调用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)));