2017-01-13 4 views
0

У меня есть RecyclerView во фрагменте, и элементы можно выбрать. Я решил, что с созданием переменной int focusedItem = 0; в RvAdapter и holder.itemView.setSelected(focusedItem == position); в методе onBindViewHolder. И это метод OnClick из пункта:Android - RecyclerView: добавьте новый элемент и выберите его

holder.itemView.setOnClickListener(new View.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     notifyItemChanged(focusedItem); 
     focusedItem = position; 
     notifyItemChanged(focusedItem); 
    } 
}); 

И в файле XML для элемента списка я использовал селектор в качестве фона, который изменяет цвет фона выбранного элемента. Это работает нормально, но я хочу добавить элементы в представление recycler и после добавления элемента он не работает так хорошо.

Это, как я добавить элемент в с.в. (в классе фрагмент):

entries.add(0, new ...); 
rvAdapter.notifyItemInserted(0); 
recyclerView.scrollToPosition(0); 

Так что я добавить элемент в ArrayList на первой позиции. Затем я уведомляю адаптер, что новый элемент в первой позиции вставлен, а затем я перейду к этому новому элементу. Теперь я хочу, чтобы новый элемент был автоматически выбран. Есть ли способ сделать это? Моя идея состояла в том, чтобы установить focusedItem = 0, но я не знаю, как отредактировать это значение в классе фрагмента. Или есть что-то вроде onItemInserted, где я могу установить эту переменную в 0?

ответ

2

Перед тем как позвонить notify.., установите focusedItem на 0. onBindViewHolder будет вызван позже, в результате чего элемент будет отображен как выбранный.

entries.add(0, new ...); 
focusedItem = 0; 
rvAdapter.notifyItemInserted(0); 
recyclerView.scrollToPosition(0); 

EDIT:

Так вы определили focusedItem в вашем Fragment вместо Adapter? Лучше всего переместить его на Adapter и добавить методы getter/setter.

0

@Roman Коломенский имел идею поместить переменную focusedItem в класс фрагмента, а не в класс RvAdapter. Это была хорошая идея и ее работа.

Так что в моем классе Fragment я имею public static int focusedItem = 0; и вот код, когда я добавить элемент:

int oldFocusedItem = focusedItem; 
focusedItem = 0; 
rvAdapter.notifyItemInserted(0); 
rvAdapter.notifyItemChanged(oldFocusedItem+1); 
recyclerView.scrollToPosition(0); 

я должен хранить последнюю SelectedItem, потому что я должен уведомить об этом адаптер, что этот пункт + 1 (потому что есть новый элемент, прежде чем) изменился, потому что он должен освободить выделение. И затем я установил focusItem равным 0. И в классе RvAdapter я использую MyFragment.focusedItem, чтобы получить выбранный элемент.

+0

Yeap, вы правы, забыли часть отмены выделения :) –

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