0

我知道。靜態ViewHolder模式。那麼這個靜態Viewholder裏面的onClick模式是什麼?

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 

static ViewHolder它的推薦。

也onClick()在ViewHolder構造函數中它的推薦,而不是在onBind()方法。

public ViewHolder(View v){ 
     super(v); 
     v.setOnClickListener(this); 
    } 

但知道我們有內部的onClick()的靜態ViewHolder類

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

     public ViewHolder(View v){ 
      super(v); 
      v.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Log.d(TAG, "position = " + getAdapterPosition()); 
     } 

,現在是這一切的建議後,我的問題。

如果我想從此回收站和通知適配器中的列表中刪除項目,現在推薦使用什麼內容。

我的列表必須是靜態的OK .. 但是仍然無法在內部onClick()中使用notifyDataSetChanged();

對此有何建議?模式?或有用的例子會很好。 或你如何在你的項目中做到這一點。

thx!

回答

1

我的目錄必須是靜態確定

你並不需要讓你的數據集列表是靜態的。如果你這樣做,在某些情況下會出錯。

但是仍然不能在內部onClick()中使用notifyDataSetChanged();

你不需要或者你不應該那樣做。

讓我來解釋一下。 ViewHolder的工作是保存行佈局中的各個項目,以避免每次對它們查找findViewById().See this video for more detailed explanation

您應該做的是向適配器提供回調或偵聽器,並將適配器內發生的數據更改的所有權轉移給您的活動。

例如。讓我們舉一個簡單的項目點擊監聽,這樣的:現在

public interface ItemClickListener<T>{ 
    void onItemClick(int position, T item) 
} 

,您轉接器內,創建對接口的引用,並提供setter方法是這樣的:

public class MyAdapter extends ...{ 
    ... 
    ... 
    private ItemClickListener<MyItemModel> clickListener; 

    public void setItemClickListener(ItemClickListener<MyItemModel> clickListener{ 
    this.clickListener = clickListener; 
    } 

} 

現在你需要內部ViewHolder做什麼將點擊事件發送到您的自定義偵聽器,如下所示: 您的ViewHolder不需要是靜態的。靜態內部類很好,因爲它們不保留對外部類的引用。 ViewHolder的目的是綁定單獨的視圖並指定其實例的標籤,以便稍後在滾動而不需要執行findViewById()時進行查看。

public class ViewHolder extends ...{ 
     ... 
     ... 
     @Override 
     public void onClick(View v) { 
      Log.d(TAG, "position = " + getAdapterPosition()); 
      if(clickListener!=null){ 
       clickListener.onItemClick(position , myList.get(position)) 
      } 
     } 

} 

所以,你可以在用戶點擊訪問您的項目,位置,操作數據,並通知在你的活動適配器如下圖所示:

public class MyActivity extends Activity implements ItemClickListener<MyItemModel>{ 

    .... 
    ... 
    myAdapter = new MyAdapter(myList); 
    myAdapter.setItemClickListener(this); 

    ... 
    ... 

    @Override 
    public void onItemClick(int position,MyItemModel item) 
    myAdapter.myList.manipulateDataOrWhaever(); 
    myAdapter.notifyDataSetChanged(); 
    } 
} 

如果你要保持你的ViewHolder靜態避免隱引用外部類。你可以註冊點擊裏面onBindViewHolder()這樣的監聽器:

....onBindViewHolder() { 
     holder.itemView.setOnClickListener(){ 
    ....//same as click listener on ViewHolder 

    } 

} 
+0

如果我ViewHolder也不是一成不變的,我做同樣喜歡你。所以對我來說它是一個好方法。但我認爲這應該是靜態的,因爲避免對ViewHolder(Google示例https://developer.android.com/training/improving-layouts/smooth-scrolling.html等事件)的引用。我需要使用靜態和非靜態ViewHolder來測試性能。無論如何thx爲您的解釋! – Esperanz0

+0

但你可以保持你的視圖的靜態,並且它總是一個很好的習慣。你可以在onbindviewholder()裏面註冊監聽器。 –

+0

並使數據集列表靜態也會導致內存泄漏。 –