1

在我的里面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;
  }
}

有人对如何更新列表适配器有任何想法吗?

4

1 回答 1

2

然而,这给了我一个 java.lang.UnsupportedOperationException。我还阅读了有关在主线程上运行它的信息,但是它给了我同样的例外。

这与主 UI 线程无关,是适配器相关的。问题是您使用扩展的适配器ArrayAdapter向其传递数据数组。超类ArrayAdapter将获取该数据数组并将其转换List为未实现add()and方法的 a。remove()没有这些方法意味着您的适配器将UnsupportedOperationException在尝试clearadd元素(从 API 级别 11 开始可用的方法,所以要小心)时向它(您正在尝试做的事情)抛出一个,因为它使用列表中的这些方法。

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

我还注意到,如果 newList 的计数与前一个不同,我会得到 java.util.ArrayList.throwIndexOutOfBoundsException,这表明我缺少刷新数据源的内容。

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

于 2013-02-28T16:23:01.437 回答