UnsupportedOperationException

UnsupportedOperationException

在我的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将采用该数据数组并将其转换为未实现Listadd()方法的remove()。没有这些方法意味着您的适配器在尝试使用UnsupportedOperationExceptionclear元素时会抛出一个add(该方法可从API级别11开始使用,因此请谨慎使用)到它(您正在尝试做的事情)列表中的那些方法。

解决方案是使用普通的ArrayList(或其他List)而不是CellItem的数组,并将其传递给ArrayAdapter(将能够对其进行修改)。


  我还注意到,如果newList与
  以前,我得到了java.util.ArrayList.throwIndexOutOfBoundsException,
  这表明我缺少刷新数据源的内容。


我不知道是什么原因造成的,您的代码应该在超出任何界限之前抛出UnsupportedOperationException异常。

10-08 03:16