0

私は知っています。静的ビューのホルダーパターン。では、この静的なViewholder内のonClickのパターンは何ですか?

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

静的なViewHolderが推奨されます。

ViewHolderコンストラクタのonClick()も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()); 
     } 

とは、すべてこの勧告の後に私の質問です。

このリサイクラーとnotifiアダプターのリストからアイテムを削除したいとしたらどうするのがいいでしょう。

私のリストは静的でなければなりません。 しかし、内部のonClick()でもnotifyDataSetChanged()は使用できません。

この場合の推奨事項はありますか?パターン?有用な例は素晴らしいでしょう。 あなたのプロジェクトでこれをどうやってやっていますか?

thx!

答えて

1

私のリストは、あなたのデータセットリストは、静的にする必要はありません静的OK

でなければなりません。あなたがそうするなら、それは間違ってしまうこともあります。

でも、内部のonClick()でnotifyDataSetChanged()を使用することはできません。

あなたはそうする必要はありません。そうしないでください。

あなたを説明しましょう。 ViewHolderの仕事は、.See this video for more detailed explanationごとにfindViewById()の検索を避けるために、個々のアイテムを行レイアウトに保持しています。

アダプタにコールバックまたはリスナーを提供し、アダプタ内で発生したデータ変更の所有権をアクティビティに転送する必要があります。

たとえば、のは、このような単純な項目のクリックリスナーを見てみましょう:

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

今、あなたのアダプタの内部で、そのインターフェースへの参照を作成し、このようなセッター提供:

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

} 

だから、あなたは、ユーザーがクリックしたときに、あなたの商品や位置にアクセスし、データを操作し、以下のようなあなたの活動にadaptorに知らせることができます。

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() { 
     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

とデータセットリストを静的にすると、メモリリークも発生します。 –

関連する問題