在我的ListFragment
中我有这个:
private SelectedItemListAdapter selectedItemListAdapter;
public void initSelectedItemListAdapter(CellItem[] itemList)
{
selectedItemListAdapter = new SelectedItemListAdapter(getSherlockActivity(), R.layout.listview_item_selecteditem, itemList);
setListAdapter(selectedItemListAdapter);
}
调用此方法允许我在ListView
中设置数据,但到目前为止,我尝试更新此数据的所有内容都已失败。我设法让它工作的唯一方法是创建一个SelectedItemListAdapter
的新实例,我认为这个实例效率不高。
我试过的一次尝试是使用:
public void updateSelectedItemListAdapter(CellItem[] newList)
{
selectedItemListAdapter.clear();
for(int i = 0; i < newList.length; i++)
selectedItemListAdapter.add(newList[i]);
setListAdapter(selectedItemListAdapter);
selectedItemListAdapter.notifyDataSetChanged();
}
然而,这给了我一个java.lang.UnsupportedOperationException
。我还读到了在主线程上运行它,但是它给了我同样的例外。
我还注意到,如果newList
与之前的计数不同,我会得到java.util.ArrayList.throwIndexOutOfBoundsException
,这表示我遗漏了一些要刷新数据源的内容。
根据要求,这是我的SelectedItemListAdapter
:
public class SelectedItemListAdapter extends ArrayAdapter<CellItem>
{
Context context;
int layoutResourceId;
CellItem data[] = null;
private static final int ROW_ITEM = 0;
private static final int ROW_VIEWTYPE_COUNT = 1;
class CellItemHolder
{
LinearLayout rootLayout;
TextView itemName;
TextView itemValue;
}
public SelectedItemListAdapter(Context context, int layoutResourceId, CellItem[] data)
{
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
CellItemHolder holder = null;
CellItem item = getItem(position);
if(row == null)
{
holder = new CellItemHolder();
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder.rootLayout = (LinearLayout)row.findViewById(R.id.itemlist_rootLayout);
holder.itemName = (TextView)row.findViewById(R.id.selectedItem_name);
holder.itemValue = (TextView)row.findViewById(R.id.selectedItem_value);
row.setClickable(true);
row.setTag(holder);
}
else
{
holder = (CellItemHolder)row.getTag();
}
holder.itemName.setText(item.itemName);
holder.itemValue.setText(item.itemValue);
holder.rootLayout.setBackgroundColor(Color.WHITE);
return row;
}
@Override
public int getCount()
{
return data.length;
}
@Override
public int getViewTypeCount()
{
return ROW_VIEWTYPE_COUNT;
}
@Override
public int getItemViewType(int position)
{
return ROW_ITEM;
}
}
有没有人对如何更新我的列表适配器有任何想法?
答案 0 :(得分:2)
然而,这给了我一个java.lang.UnsupportedOperationException。一世 还阅读了关于在主线程上运行它的内容,但它给了我 同样的例外。
这与主UI线程无关,与适配器有关。问题是你使用扩展ArrayAdapter
的适配器传递一个数据数组。超类ArrayAdapter
将获取该数据数组并将其转换为未List
和add()
方法未实现的remove()
。没有这些方法意味着你的适配器在尝试UnsupportedOperationException
或clear
元素(从API级别11开始的方法,所以要小心)时会抛出add
(你正在尝试什么)这样做,因为它使用列表中的那些方法。
解决方法是使用普通ArrayList
(或其他List
)代替CellItem
数组,并将其传递给ArrayAdapter
(这将是修改它。)
我还注意到,如果newList具有不同的计数 之前,我得到java.util.ArrayList.throwIndexOutOfBoundsException, 这表明我错过了刷新数据源的东西。
我不知道是什么导致这种情况,你的代码应该在任何边界超越之前抛出UnsupportedOperationException
异常。