677 Stimmen

RecyclerView onClick

Hat jemand, der RecyclerView verwendet, einen Weg gefunden, um einen onClickListener für Elemente im RecyclerView festzulegen? Ich dachte daran, für jedes Element einen Listener für jedes Layout festzulegen, aber das scheint etwas zu umständlich zu sein. Ich bin sicher, dass es eine Möglichkeit gibt, dass der RecyclerView auf das onClick-Ereignis hört, aber ich kann es nicht ganz herausfinden.

9voto

Sushant Punkte 1254

Es gibt einen viel einfacheren Weg, dies zu tun. Wenden Sie einfach im onBindViewHolder auf der Stammansicht einen Klick an.

Angenommen dies ist Ihre Ansicht für den Adapter,

Dann tun Sie folgendes in Ihrem Adapter

//Layout erhalten und View Holder erstellen
@Override
public RVAdapter.ViewHolder1 onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, null);
    ViewHolder1 viewHolder = new ViewHolder1(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(RVAdapter.ViewHolder1 holder, int position) {

    //Klicken Sie auf Ihre Stammansicht
    holder.linearlayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Klicken Sie auf die Durchführung
        }
    });
}

//Verweise auf Ansichten im Layout einschließlich der Stammansicht erstellen
public class ViewHolder1 extends RecyclerView.ViewHolder {

    protected LinearLayout linearlayout = null
    protected TextView textview = null;

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

        this.linearlayout = (LinearLayout) itemView.findViewById(R.id.linearlayout);
        this.tvCompName = (TextView) itemView.findViewById(R.id.textview);
    }
}

8voto

Manikanta Punkte 3421

Vielleicht zu einfach und effektiv.

Anstatt das Interface View.OnClickListener innerhalb des Ansichtshalters zu implementieren oder ein Interface zu erstellen und das Interface in Ihrer Aktivität zu implementieren - Ich habe diesen Code für eine einfache OnClickListener-Implementierung verwendet.

public static class SimpleStringRecyclerViewAdapter
            extends RecyclerView.Adapter {

        // Ihre Initialisierungen gehen hier...
        private List mValues;

        public static class ViewHolder extends RecyclerView.ViewHolder {

            //ein Variable mView erstellen
            public final View mView;

            /*Alle Ihre Zeilen-Widgets gehen hier
            public final ImageView mImageView;
            public final TextView mTextView;*/

            public ViewHolder(View view) {
                super(view);
                //Initialisieren Sie es hier
                mView = view;

                /* Ihre Zeilen-Widgets-Initialisierungen gehen hier
                mImageView = (ImageView) view.findViewById(R.id.avatar);
                mTextView = (TextView) view.findViewById(android.R.id.text1);*/
            }
        }

        public String getValueAt(int position) {
            return mValues.get(position);
        }

        public SimpleStringRecyclerViewAdapter(Context context, List items) {

            mBackground = mTypedValue.resourceId;
            mValues = items;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item, parent, false);
            view.setBackgroundResource(mBackground);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            holder.mBoundString = mValues.get(position);
            holder.mTextView.setText(mValues.get(position));

            //Hier wird einfach ein onItemClick-Listener geschrieben
            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, ExampleActivity.class);

                    context.startActivity(intent);
                }
            });
        }

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

8voto

Francis Shi Punkte 385

Sie können einen clickListener an den Adapter übergeben.

In Ihrer Activity:

private View.OnClickListener mItemClick = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent intent = null;
        int position = list.getChildPosition(v);
        switch (position) {
            case 0:
                intent = new Intent(MainActivity.this, LeakCanaryActivity.class);
                break;
            case 1:
                intent = new Intent(MainActivity.this, ButterKnifeFragmentActivity.class);
                break;
        }
        if (intent != null) {
            MainActivity.this.startActivity(intent);
        }
    }
};

dann übergeben Sie ihn an den Adapter:

MainAdapter mainAdapter = new MainAdapter(this, mItemClick);

In Adapter's onCreateViewHolder:

 @Override
public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
    View itemView = activity.getLayoutInflater().inflate(R.layout.main_adapter_item, viewGroup, false);
    ViewHolder holder = new ViewHolder(itemView);
    itemView.setOnClickListener(mItemClick);
    return holder;
}

7voto

Chathura Jayanath Punkte 609

Ich habe eine leichte Bibliothek für Android entwickelt, die du auf GitHub besuchen und diesem Beispiel folgen kannst:

RecycleClick.addTo(DEIN_RECYCLE_VIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
    @Override
    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
        // Dein Code hier
    }
});

7voto

savepopulation Punkte 11248

Sie können View.OnClickListener implementieren zu Ihrer ViewHolder Klasse.

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

    public Item item;
    @InjectView(R.id.tv_title) 
    public TextView tvTitle;
    @InjectView(R.id.rl_row) 
    public RelativeLayout rlRow;

    public ViewHolder(View v) {
        super(v);
        ButterKnife.inject(this, v);
        v.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        Log.e("item title",item.getTitle());
    }
}

Und onBindViewHolder setzen Sie das Item Ihres ViewHolders:

public void onBindViewHolder(ViewHolder holder, int position) {
    holder.tvTitle.setText(objects.get(position).getTitle());
    holder.item = objects.get(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