更新片段内的列表视图

时间:2013-02-28 15:26:35

标签: android listview android-listview android-arrayadapter

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

解决方法是使用普通ArrayList(或其他List)代替CellItem数组,并将其传递给ArrayAdapter(这将是修改它。)

  

我还注意到,如果newList具有不同的计数   之前,我得到java.util.ArrayList.throwIndexOutOfBoundsException,   这表明我错过了刷新数据源的东西。

我不知道是什么导致这种情况,你的代码应该在任何边界超越之前抛出UnsupportedOperationException异常。