2

我在每個View一個EditText,並且在onViewRecycled(.)我與任何用戶輸入更新所述Adapter的項目。爲了保持滾動Views的信息的目的。可以/應該RecyclerView.Adapter可以訪問ViewHolders嗎?

但是,我意識到,這個解決方案這是一個有點麻煩檢索已被修改,但沒有回收利用的信息。我通過將每個ViewHolderAdapter一個單獨的列表(在onCreateViewHolder(.)加),因爲我無法找到一個更簡單的方法來更新屏幕上的Views解決了這個。

是否有任何理由不這樣做;讓Adapter直接訪問ViewHolders?即有沒有更好的方法來調用當前存在的所有Views函數?

編輯:

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的目的是,爲它的名字暗示,要保存項目的視圖層次結構,這樣Views可以被RecyclerView緩存和重用。「'它由'android.support.v7.widget.RecyclerView完成。Recycler',ViewHolder和view reusing是兩個不同的東西,ViewHolder的目的是爲了方便的子視圖查找,所以你不需要在'onBindViewHolder'內部有'findViewById' – pskink