2013-02-28 3 views
1

В моей ListFragment я это:Обновление ListView внутри фрагмента

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; 
    } 
} 

Кто-нибудь есть какие-либо идеи о том, как я могу обновить свой список адаптер?

+0

Не стесняйтесь также добавить код для вашего адаптера. – Luksprog

+0

Я только что добавил это! –

+0

Где находится метод добавления SelectedItemListAdapter? – Luciano

ответ

2

Однако это дает мне java.lang.UnsupportedOperationException. I также читал о запуске этого на основном потоке, однако это дает мне то же исключение.

Это не имеет никакого отношения к основной теме интерфейса адаптера. Дело в том, что вы используете адаптер, расширяющий ArrayAdapter, передавая ему массив данных. Суперкласс ArrayAdapter примет этот массив данных и преобразует его в List, для которого методы add() и remove() не реализованы. Не имея этих методов означает, что ваш адаптер будет генерировать UnsupportedOperationException при попытке использовать clear или add элементов (доступный метод, начиная с уровня API 11, так что будьте осторожны) к нему (что вы пытаетесь сделать), поскольку он использует эти методы в списке.

Решение состоит в том, чтобы использовать обычный ArrayList (или другой List) вместо массива CellItem и передать, что к ArrayAdapter (который будет иметь возможность изменить его).

Я также заметил, что если NewList имеет различное количество к предыдущей, я получаю java.util.ArrayList.throwIndexOutOfBoundsException, который предполагает, что я что-то для обновления источника данных отсутствует.

Я не знаю, что вызывает это, ваш код должен выбросить исключение UnsupportedOperationException перед тем, как выйти за пределы границ.

+0

Спасибо. Я понятия не имел, почему я использовал массив, а не список!: D –

+0

@ ing0 В качестве побочного примечания, если вы собираетесь переопределить большинство методов «ArrayAdapter», вы можете также расширить «BaseAdapter» и избежать других возможных проблем. – Luksprog

+0

О, хорошо спасибо, никогда не думал об этом. –

Смежные вопросы