2017-12-30 45 views
-1

Ich habe sehr kleine Frage hier, in meinem Recycling-Ansicht Adapter Klasse verwende ich List<FeaturedTags> und es funktioniert gut.Wiederverwendung des RecyclerView-Adapters

Jetzt haben wir neu eingeführte Klasse namens "FeaturedLangTags, der einzige Unterschied zwischen FeaturedTags & FeaturedLangTags ist nur ein Zusatz von Lang Feld. Aber wir verwenden dieses Lang-Feld sowieso nicht, um es auf dem Bildschirm anzuzeigen.

Die Ausgabe der Recyclingansicht sieht dem vorhandenen Adapter FeaturedTags genau ähnlich. Hier möchte ich wissen, wie ich die vorhandene Adapter-Klasse wieder verwenden kann, um List<FeaturedLangTags> Artikel anzuzeigen?

Eine einfache Möglichkeit besteht darin, den vorhandenen Adapter zu duplizieren und die FeaturedLangTags Liste zu übergeben, aber hier wird so viel von Code dupliziert. Ich würde gerne wissen, wie ich die bestehende Klasse tweeken kann?

Antwort

2

Erstellen Adapter von generischen List<T>, die in beiden Bedingungen verwendet werden können.

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

Erstellen Sie eine gemeinsame Schnittstelle oder Superklasse zu FeaturedTags und FeaturedLangTags, dann verwenden Sie den gleichen Adapter.

Oder verwenden Sie einen allgemeineren Ansatz für Ihren Adapter wie AdapterDelegates.

0

Sie können zwei verschiedene Konstruktoren für den Adapter erstellen und diese erreichen.

+0

Aber wie werde ich holen die Daten ?. d. h. onBindViewHolder-Methode? – Naruto

0

können Sie haben beide Klassen eine gemeinsame Schnittstelle implementieren sagen Common Interface

Machen Sie Ihre Liste vom Typ

YourList<CommonInterface> 

In Ihrem Adapter, überschreiben die

getItemViewType 

Methode. Verwenden Sie hier die Instanz von operator, um zu überprüfen, um welchen Typ von Klasse es sich handelt, und geben Sie eine View-Integer-Zahl zurück. Say for ohne lang, es wird eine ganze Zahl 0 sein und damit 1

Jetzt in Ihrem onCreateViewHolder übergeben Sie den ViewType als zweiten Parameter. Wenn Sie das verwenden, wird Ihr Layout für die Ansicht aufgebläht.

In Ihrem onBindViewHolder können Sie

getItemViewType 

Auf den im Parameter übergebene Inhaber überprüfen und Ihre Schnittstelle explizit auf das gewünschte Objekt werfen. Dann benutze es wie gewohnt.

Referenz für diese mehrere Ansichtstypen ist Recycler view multiple view types

Verwandte Themen