1

私のListFragment中にこれがあります:

private SelectedItemListAdapter selectedItemListAdapter;
public void initSelectedItemListAdapter(CellItem[] itemList)
{
  selectedItemListAdapter = new SelectedItemListAdapter(getSherlockActivity(), R.layout.listview_item_selecteditem, itemList);
  setListAdapter(selectedItemListAdapter);
}

このメソッドを呼び出すと、データを設定できますが、ListViewこれまでにこのデータを更新しようとして失敗したことはすべて失敗しました。SelectedItemListAdapter私がそれを機能させることができた唯一の方法は、あまり効率的ではないと思う新しいインスタンスを作成することです。

私が試した1つの試みは、次を使用することでした。

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に変換します。これらのメソッドがないということは、リストのメソッドを使用するため、アダプターが要素(APIレベル11以降で使用可能なメソッドなので注意してください)をスローすることを意味します。Listadd()remove()UnsupportedOperationExceptionclearadd

解決策は、の配列の代わりに通常のArrayList(または他の)を使用し、それを(を変更できるようになる)に渡すことです。ListCellItemArrayAdapter

また、newListのカウントが以前とは異なる場合、java.util.ArrayList.throwIndexOutOfBoundsExceptionが発生します。これは、データソースを更新するための何かが不足していることを示しています。

何が原因なのかわかりませんUnsupportedOperationException。境界を越える前に、コードで例外をスローする必要があります。

于 2013-02-28T16:23:01.437 に答える