在我的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;
}
}
是否有人对我如何更新列表适配器有任何想法?
最佳答案
但是,这给了我一个java.lang.UnsupportedOperationException。一世
还阅读了有关在主线程上运行此命令的信息,但是它给了我
同样的例外。
这与主UI线程无关,与适配器相关。问题是您使用了扩展ArrayAdapter
的适配器,并向其传递数据数组。超类ArrayAdapter
将采用该数据数组并将其转换为未实现List
和add()
方法的remove()
。没有这些方法意味着您的适配器在尝试使用UnsupportedOperationException
或clear
元素时会抛出一个add
(该方法可从API级别11开始使用,因此请谨慎使用)到它(您正在尝试做的事情)列表中的那些方法。
解决方案是使用普通的ArrayList
(或其他List
)而不是CellItem
的数组,并将其传递给ArrayAdapter
(将能够对其进行修改)。
我还注意到,如果newList与
以前,我得到了java.util.ArrayList.throwIndexOutOfBoundsException,
这表明我缺少刷新数据源的内容。
我不知道是什么原因造成的,您的代码应该在超出任何界限之前抛出UnsupportedOperationException
异常。