2017-12-30 56 views
-1

ここでは私のリサイクルビューアダプタークラスでは、私はList<FeaturedTags>とその正常に動作しています。RecyclerViewアダプターを再利用

今、私たちは、新たに「FeaturedLangTagsというクラスを導入している、FeaturedTags & FeaturedLangTagsの唯一の違いは、Langフィールドだけの追加です。しかし、私たちはこのラングフィールドを画面に表示するために使用していません。

リサイクルビューの出力は、既存のFeaturedTagsアダプタとまったく同じように見えます。ここで私はどのように私はList<FeaturedLangTags>アイテムを表示するために、既存のアダプタクラスを再使用することができますか?

既存のアダプタを複製してFeaturedLangTagsリストを渡すのが1つの簡単な方法ですが、多くのコードが重複しています。私はどのように私は既存のクラスをtweekできるのか知りたいですか?

答えて

2

一般的なList<T>のアダプタを作成し、両方の条件で使用できます。

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context context; 
    private ArrayList<T> items; 

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent); 

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val); 

    public GenericAdapter(Context context, ArrayList<T> items){ 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder holder = setViewHolder(parent); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     onBindData(holder,items.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 

    public void addItems(ArrayList<T> savedCardItemz){ 
     items = savedCardItemz; 
     this.notifyDataSetChanged(); 
    } 

    public T getItem(int position){ 
     return items.get(position); 
    } 
} 


adapter = new GenericAdapter<DataModel>(context,modelList) { 
     @Override 
     public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) { 
      final View view =   LayoutInflater.from(context).inflate(R.layout.item_view_holder, parent, false); 
      ItemViewHolder viewHolder = new ItemViewHolder(context, view); 
      return viewHolder; 
     } 

     @Override 
     public void onBindData(RecyclerView.ViewHolder holder1, DataModel val) { 
       DataModel userModel = val; 

       ItemViewHolder holder = (ItemViewHolder)holder1; 
       holder.name.setText(userModel.getName()); 
       holder.fatherName.setText(userModel.getFatherName()); 
     } 
    }; 
    mRecyclerView.setAdapter(adapter); 
0

FeaturedTagsFeaturedLangTagsの共通インターフェイスまたはスーパークラスを作成し、同じアダプタを使用します。

AdapterDelegatesのような、より一般的な方法を使用してください。

0

アダプタ用に2つの異なるコンストラクタを作成して、それを実現できます。

+0

である。しかし、どのように私は、データがフェッチされます?。つまりonBindViewHolderメソッドですか? – Naruto

0

あなたが持つことができます両方のクラスが一つの共通のインターフェイスを実装するには、CommonInterfaceが

getItemViewType 

メソッドをオーバーライドして、あなたのアダプタで

YourList<CommonInterface> 

タイプ

のあなたのリストを作成しますと言います。ここでは、演算子のインスタンスを使用して、それがどのタイプのクラスであるかをチェックし、整数型のビューを返します。 langを指定しない場合、整数0になります。1

これで、onCreateViewHolderで2番目のパラメータとしてviewTypeが渡されます。これを使用すると、ビューを選択する際にレイアウトが膨張します。あなたのonBindViewHolderで

、あなたはパラメータに渡されたホルダーに

getItemViewType 

をチェックして、必要なオブジェクトに明示的にあなたのインターフェースをキャストすることができます。その後、通常通り使用してください。この複数のビュータイプのため

リファレンス Recycler view multiple view types

関連する問題