2

У меня есть EditText в каждом View, а также в onViewRecycled(.) Я обновляю товар в Adapter любым пользователем. С целью сохранения информации при прокрутке Views и обратно.Может ли адаптер RecyclerView.Adapter иметь доступ к ViewHolders?

Однако я понял, что с этим решением немного хлопот по извлечению информации, которая была изменена, но не переработана. Я решил это, добавив каждый ViewHolder в отдельный список в Adapter (добавлен в onCreateViewHolder(.)), так как я не смог найти более простой способ обновить Views на экране.

Есть ли причина не делать этого; пусть Adapter имеют прямой доступ к ViewHolders? То есть есть ли лучшие способы вызова функции на всех Views в настоящее время в наличии?

Edit:

public class AdapterRv extends Adapter<AdapterRv.MyViewHolder> { 
    private List<Item> items; 
    private List<MyViewHoders> viewHolders; 

    public AdapterRv(List<Item> inItems) { 
     ... 

     viewHolders = new ArrayList<>(); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 
     private EditText text; 
     private Item item; 

     private MyViewHolder(View inView) { 
      ... 
     } 

     public void bindItem(Item inItem) { 
      ... 
     } 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup inParent, int inViewType) { 
     ... 

     if (!viewHolders.contains(tmpHolder)) { 
      viewHolders.add(tmpHolder); 
     } 

     ... 
    } 

    .... 

    @Override 
    public void onViewRecycled(MyViewHolder inViewHolder) { 
     saveView(inViewHolder.item, inViewHolder.text.getText().toString()); 
    } 

    private void saveViews() { 
     for (MyViewHolder tmpViewHolder : viewHolders) { 
      saveView(tmpViewHolder.item, tmpViewHolder.text.getText().toString()); 
     } 
    } 

    private void saveView(Item inItem, String inNewText) { 
     if (inItem.getText().equals(inNewText)) { 
      return; 
     } 
     inItem.setText(inNewText); 
    } 

    public List<Item> fetchTexts() { 
     saveViews(); 
     return items; 
    } 
} 
+2

вы можете добавить код, поэтому он сам поясняет –

+1

вы просто называете nmAdapter.notifyDataSetChanged(); или как @ParthAnjaria говорит, что имеет некоторый код – Shailesh

+1

Существуют различные способы уведомления RecyclerView «обновить» его виды –

ответ

2

Цель RecyclerView.Adapter только для создания ViewHolder экземпляров и предоставлять их с данными, но это само по себе RecyclerView, что просит держателей и управляет ими.

Целью ViewHolder является, как следует из названия, сохранение иерархии позиций элемента, поэтому Views может быть кеширован и повторно использован RecyclerView. Следовательно, адаптер должен создавать и привязывать правильные данные к держателям, и рекомендуется не хранить ссылки на держатели внутри адаптера, так как вам нужна только ссылка на держатель в методе onBindViewHolder(ViewHolder holder, int position, где он предоставляется RecyclerView , Также наоборот, держатели обзора не нуждаются в ссылке на адаптер, поэтому ваш MyViewHolder должен быть помечен static.

Если вам необходимо работать с видом Ресайклера, тем RecyclerView имеет множество методов в его API, таких как findViewHolderForLayoutPosition(int position), getChildViewHolder(View child) и т.д. Вы также можете установить слушатель для наблюдения прокрутки, пункт потрогать, просматривать присоединять состояния и т.д. изменения. See the documentation for the RecyclerView

Так что, если вам нужно получить доступ и манипулировать мнения (т. Е вызвать функцию на всех взглядах Ресайклера в), делает это через RecyclerView и не адаптер, потому что это утилизатор, который управляет ими - адаптер только предоставляет данные.

+0

'' Цель ViewHolder - это, как это имя предполагает, чтобы удерживать иерархию представлений элемента, чтобы представления могли кэшироваться и повторно использоваться RecyclerView. "' Это делается с помощью 'android.support.v7.widget.RecyclerView.Recycler', ViewHolder и просмотр повторного использования - это две разные вещи, цель ViewHolder - простой поиск детского вида, поэтому вам не нужно 'findViewById' внутри' onBindViewHolder' – pskink