1048 Stimmen

Warum hat RecyclerView keine onItemClickListener()?

Ich habe RecyclerView erkundet und war überrascht zu sehen, dass RecyclerView keine onItemClickListener() hat.

Ich habe zwei Fragen.

Hauptfrage

Ich möchte wissen, warum Google onItemClickListener() entfernt hat?

Gibt es ein Leistungsproblem oder etwas anderes?

Nebenfrage

Ich habe mein Problem gelöst, indem ich onClick in meinem RecyclerView.Adapter geschrieben habe:

public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
    }

    @Override
    public void onClick(View v) {

    }
}

Ist das okay / gibt es einen besseren Weg?

5voto

Alexandru Circus Punkte 5398

Sieh dir meinen Ansatz dazu an:

Erstelle zunächst eine Schnittstelle wie diese:

/**
 * Schnittstelle, die zum Delegieren von Klickereignissen in einem {@link android.support.v7.widget.RecyclerView} verwendet wird
 * Erstellt von Alex am 28.11.2015.
 */
  public Schnittstelle OnRecyclerItemClickListener {

     /**
      * Wird aufgerufen, wenn ein Klick in der Ansicht eines RecyclerView-Elements auftritt
      * @param view, die angeklickt wurde
      * @param position der angeklickten Ansicht
      * @param item die konkreten Daten, die durch die angeklickte Ansicht angezeigt werden
      */
      void onItemClick(View view, int position, T item);
   }

Dann erstelle den Adapter:

public Klasse CustomRecyclerAdapter erweitert RecyclerView.Adapter {      

    private Klasse InternalClickListener implementiert View.OnClickListener{

      @Override
      public void onClick(View v) {
        if(mRecyclerView != null && mItemClickListener != null){
            // finde die Position des angeklickten Elements
            int position = mRecyclerView.getChildAdapterPosition(v);
            Daten data = getItem(position);
            // benachrichtige den Hauptlistener
            mItemClickListener.onItemClick(v, position, data);
        }
    }
}

private final OnRecyclerItemClickListener mItemClickListener;
private RecyclerView mRecyclerView;    
private InternalClickListener mInternalClickListener;

/**
 *
 * @param itemClickListener zum Auslösen eines Klickereignisses für ein Element
 */
public PlayerListRecyclerAdapter(OnRecyclerItemClickListener itemClickListener){        
    mItemClickListener = itemClickListener;
    mInternalClickListener = new InternalClickListener();
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);

    v.setOnClickListener(mInternalClickListener);

    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    // hier die Bindung durchführen
}

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

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);

    mRecyclerView = recyclerView;
}

@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
    super.onDetachedFromRecyclerView(recyclerView);

    mRecyclerView = null;
}

public Daten getItem(int position){
    return mDataset.get(position);
}
}

Und jetzt schauen wir, wie man dies aus einem Fragment integriert:

public Klasse TestFragment erweitert Fragment implements OnRecyclerItemClickListener{
   private RecyclerView mRecyclerView;

   @Override
   public void onItemClick(View view, int position, Daten item) {
     // etwas tun
   }

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      return inflater.inflate(R.layout.test_fragment, container, false);
   }

   @Override
   public void onViewCreated(View view, Bundle savedInstanceState) {
      mRecyclerView = view.findViewById(idOfTheRecycler);
      mRecyclerView .setAdapter(new CustomRecyclerAdapter(this));
   }

4voto

Ashok Reddy M Punkte 320

Ja, du kannst es

public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {

    //Die Ansicht aufblasen

    View ansicht = LayoutInflator.from(parent.getContext()).inflate(R.layout.layoutID,null);

    ViewHolder halter = new ViewHolder(ansicht);

    //Hier können wir den onClickListener setzen
    ansicht.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v)
        {
            //Aktion
        }
    });

return halter;

3voto

Naren Punkte 2596

Dies hat bei mir funktioniert:

@Override
public void onBindViewHolder(PlacesListViewAdapter.ViewHolder holder, int position) {
    ----
    ----
    ----
    // Set setOnClickListener(holder);
}

@Override
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    ----
    ----
    ----

    @Override
    public void onClick(View view) {
        // Benutzen, um das angeklickte Element zu erhalten getAdapterPosition()
    }
}

3voto

Arpit Patel Punkte 9027

Hier können Sie mehrere onclicks sehen, siehe unten den Code, der sehr effizient ist

    public class RVNewsAdapter extends RecyclerView.Adapter {

    private Context context;
    List newsList;
    // Ermöglicht das Erinnern an das zuletzt angezeigte Element auf dem Bildschirm
    private int lastPosition = -1;

    public RVNewsAdapter(List newsList, Context context) {
        this.newsList = newsList;
        this.context = context;
    }

    public static class FeedHolder extends RecyclerView.ViewHolder implements OnClickListener {

        ImageView img_main;
        TextView tv_title;
        Button bt_facebook, bt_twitter, bt_share, bt_comment;

        public FeedHolder(View itemView) {
            super(itemView);

            img_main = (ImageView) itemView.findViewById(R.id.img_main);
            tv_title = (TextView) itemView.findViewById(R.id.tv_title);
            bt_facebook = (Button) itemView.findViewById(R.id.bt_facebook);
            bt_twitter = (Button) itemView.findViewById(R.id.bt_twitter);
            bt_share = (Button) itemView.findViewById(R.id.bt_share);
            bt_comment = (Button) itemView.findViewById(R.id.bt_comment);

            img_main.setOnClickListener(this);
            bt_facebook.setOnClickListener(this);
            bt_twitter.setOnClickListener(this);
            bt_comment.setOnClickListener(this);
            bt_share.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {

            if (v.getId() == bt_comment.getId()) {

                Toast.makeText(v.getContext(), "Kommentar  ", Toast.LENGTH_SHORT).show();

            } else if (v.getId() == bt_facebook.getId()) {

                Toast.makeText(v.getContext(), "Facebook  ", Toast.LENGTH_SHORT).show();

            } else if (v.getId() == bt_twitter.getId()) {

                Toast.makeText(v.getContext(), "Twitter  ", Toast.LENGTH_SHORT).show();

            } else if (v.getId() == bt_share.getId()) {

                Toast.makeText(v.getContext(), "teilen  ", Toast.LENGTH_SHORT).show();

            }
            else {
                Toast.makeText(v.getContext(), "ZEILE GEDRÜCKT = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public FeedHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_row, parent, false);
        FeedHolder feedHolder = new FeedHolder(view);

        return feedHolder;
    }

    @Override
    public void onBindViewHolder(FeedHolder holder, int position) {

        holder.tv_title.setText(newsList.get(position).getTitle());

        // Hier wenden Sie die Animation an, wenn die Ansicht gebunden ist
        setAnimation(holder.img_main, position);
    }

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

    /**
     * Hier ist die Schlüsselmethode, um die Animation anzuwenden
     */
    private void setAnimation(View viewToAnimate, int position) {
        // Wenn die gebundene Ansicht zuvor nicht auf dem Bildschirm angezeigt wurde, wird sie animiert
        if (position > lastPosition) {
            Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
            viewToAnimate.startAnimation(animation);
            lastPosition = position;
        }
    }

}

2voto

Mudassir Khan Punkte 1634

Überprüfen Sie diese, in der ich alle Dinge auf ordentliche Weise implementiert habe

RecyclerViewHolder-Klasse

public class RecyclerViewHolder extends RecyclerView.ViewHolder  {

    //ViewHolder ist für das GridView, wie wir es in der ListView verwendet haben
    public ImageView imageView, imageView2;
    public RecyclerViewHolder(View itemView) {
        super(itemView);
        this.imageView=(ImageView)itemView.findViewById(R.id.image);
    }

}

Adapter

public class RecyclerView_Adapter extends RecyclerView.Adapter {

    //RecyclerView wird Recayclerview-Adapter erweitern
    private ArrayList arrayList;
    private Context context;
    private static RecyclerViewClickListener itemListener;
    //Konstruktor des RecyclerView-Adapters
    RecyclerView_Adapter(Context context, ArrayList arrayList, RecyclerViewClickListener itemListener){
        this.context=context;
        this.arrayList=arrayList;
        this.itemListener=itemListener;
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //Diese Methode wird das benutzerdefinierte Layout aufblasen und als ViewHolder zurückgeben
        LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext());
        ViewGroup mainGroup=(ViewGroup) layoutInflater.inflate(R.layout.single_item,parent,false);
        RecyclerViewHolder listHolder=new RecyclerViewHolder(mainGroup);

        return listHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, final int position) {

        final ModelClass modelClass=arrayList.get(position);
        //Halte
        RecyclerViewHolder mainHolder=(RecyclerViewHolder)holder;
        //Konvertiere das Drawable-Bild in ein Bitmap
        Bitmap image= BitmapFactory.decodeResource(context.getResources(),modelClass.getImage());
        //Setze das Bild in das ImageView
        mainHolder.imageView.setImageBitmap(image);
        //Um das Klickereignis zu behandeln, wenn auf das RecyclerView-Element geklickt wird
        // und es über die RecyclerViewHolder-Klasse erhalten wird, haben wir die Ansichten dort definiert
        mainHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Hole die Position des Bildes, das angeklickt wurde
                itemListener.recyclerViewListClicked(v,position);
            }
        });

    }

    @Override
    public int getItemCount() {
        return (null!=arrayList?arrayList.size():0);
    }
}

Die Schnittstelle

public interface RecyclerViewClickListener {

    //Dies ist die Methode, um das Ereignis zu behandeln, wenn auf das Bild in RecyclerView geklickt wird
    public void recyclerViewListClicked(View v,int position);
}

//Um diese Methode in der Aktivität aufzurufen
RecyclerView_Adapter adapter=new RecyclerView_Adapter(Wallpaper.this,arrayList,this);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

    @Override
    public void  recyclerViewListClicked(View v,int position){

        imageView.setImageResource(wallpaperImages[position]);

    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X