6

bearbeitenKlick Zuhörer Generic RecyclerView Adapter

hinzufügen, da es eine genericAdapter nicht einfach ist und ich kenne die Methoden klicken Zuhörer hinzuzufügen. Und es ist keine gute Praxis, dies in onCreateViewHolder zu tun. Also das ist, warum ich einen besseren Vorschlag brauchen

ich einen Generisches Adapter für RecyclerView in android geschaffen haben. Jetzt möchte ich einen Vorschlag, um es zu verbessern. Und wie könnte ich clickListener hinzufügen?

GenericAdapter.java

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

    private Context context; 
    private ArrayList<T> items; 
    private OnRecyclerItemClicked onRecyclerItemClicked; 

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

    public void setOnRecyclerItemClicked(OnRecyclerItemClicked onRecyclerItemClicked){ 
     this.onRecyclerItemClicked = onRecyclerItemClicked; 
    } 

    public interface OnRecyclerItemClicked{ 
     void onItemClicked(View view,int position); 
    } 
} 

Und es Rufen wie

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

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

         AViewHolder holder = (AViewHolder)holder1; 
         holder.cardNumber.setText(currentCard.getDisplayNumber()); 
         holder.cardHolderName.setText(currentCard.getCardHolderName()); 
       } 
      }; 
      mRecyclerView.setAdapter(adapter); 

Nun, wie und wo könnte ich einen Klick Zuhörer hinzufügen. Das Hinzufügen eines Klick-Listeners zu onBindData ist ein Overhead. Brauche einen Vorschlag.

+0

Mögliches Duplikat von [RecyclerView onClick] (http: // stac koverflow.com/questions/24471109/recyclerview-onclick) –

+0

Eine Möglichkeit, die ich gesehen habe, ist Ihre Ansicht Inhaber Klasse implementiert 'View.OnClickListener' –

+0

Related: http://StackOverflow.com/Questions/24471109/Recyclerview-onClick – Sufian

Antwort

4

Haben Sie eine ViewHolder Zugabe versucht, und fügen Sie den clicklistener es

Jetzt GenericAdapter.java.

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

    private Context context; 
    private List<T> items; 
    private OnRecyclerItemClicked onRecyclerItemClicked; 

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent , OnRecyclerItemClicked onRecyclerItemClicked); 

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

    public abstract OnRecyclerItemClicked onGetRecyclerItemClickListener(); 

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

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     RecyclerView.ViewHolder holder = setViewHolder(parent , onRecyclerItemClicked); 
     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 setItems(ArrayList<T> savedCardItemz){ 
     items = savedCardItemz; 
     this.notifyDataSetChanged(); 
    } 

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

    public interface OnRecyclerItemClicked{ 
     void onItemClicked(View view,int position); 
    } 
} 

Und wie diese

GenericAdapter<CreditCardItemBO> adaptering = new GenericAdapter<CreditCardItemBO>(mContext,new ArrayList<CreditCardItemBO>()) { 
      @Override 
      public RecyclerView.ViewHolder setViewHolder(ViewGroup parent, OnRecyclerItemClicked onRecyclerItemClicked) { 
       final View view = LayoutInflater.from(mContext).inflate(R.layout.item_save_credit_card, parent, false); 
       CreditCardViewHolder viewHolder = new CreditCardViewHolder(mContext, view,onRecyclerItemClicked); 
       return viewHolder; 
      } 

      @Override 
      public void onBindData(RecyclerView.ViewHolder holder, CreditCardItemBO val) { 

      } 

      @Override 
      public OnRecyclerItemClicked onGetRecyclerItemClickListener() { 
       return new OnRecyclerItemClicked() { 
        @Override 
        public void onItemClicked(View view, int position) { 

        } 
       }; 
      } 
     }; 
+0

Hat dich das sortiert? –

+0

Ich schätze deine Hilfe @Santa vielen Dank. – Nepster

+2

Können Sie den Code für CreditCardViewHolder auch teilen? – Lunatikul

0

Sie können die Zuhörer in der Tätigkeit fügen Sie den RecyclerView erklärt haben:

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, 
    new RecyclerTouchListener.ClickListener() { 
     @Override 
     public void onClick(View view, int position) { 
       //Handle the action 
      } 
     } 

     @Override 
     public void onLongClick(View view, int position) { 

     } 

    })); 
+0

Ich möchte Element Klick-Listener nicht auf ganze RecyclerView klicken – Nepster

+0

@Nepster klicken Listener nur für bestimmte Elemente ? Oder für alle Artikel? Das obige ist eine Lösung für alle Elemente, wobei die "int-Position" angibt, auf welches Element geklickt wird. – Sufian

+0

@Nepster das oben genannte wird aufgerufen, wenn einzelne Elemente angeklickt werden. Wenn Sie Listener für verschiedene Komponenten in einem Element benötigen, müssen Sie dies in der onBindViewHolder-Methode des Adapters tun. Die Methode in der früheren Antwort ermöglicht Ihnen auch, die Ereignisse in der Aktivität und nicht im Adapter zu behandeln. –

0

Aufruf I ViewHolder in Santa Lösung wie diese umgesetzt haben:

public class EmployeeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    private TextView employeeName; 
    private BaseRecyclerAdapter.OnRecyclerItemClicked mOnRecyclerItemClicked; 

    public EmployeeViewHolder(View view, BaseRecyclerAdapter.OnRecyclerItemClicked onRecyclerItemClicked) { 
     super(view); 
     employeeName = (TextView) view.findViewById(R.id.employee_name); 
     mOnRecyclerItemClicked = onRecyclerItemClicked; 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     mOnRecyclerItemClicked.onItemClicked(view, getAdapterPosition()); 
    } 

    public TextView getEmployeeName() { 
     return employeeName; 
    } 
} 

Wenn Sie das Kontext ad es um Konstruktor als Parameter benötigen.

0

Ich habe eine generische Adapter erstellt, die AAR und die Quellen sind bei this url:

es ist die einfache Nutzung:

RecyclerAdapter<Customer> mAdapter = new RecyclerAdapter(customerList, CustomerViewHolder.class); 

Add befestigen Hörer (Lambda Probe)

RecyclerItemClickListener.affectOnItemClick(mRecycler, (position, view1) -> { 
//action 
}); 

sehen URL-Link mehr Details