Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onClickListener in RecyclerView.ViewHolder

I've got a RecyclerView.ViewHolder and RecyclerView.Adapter, I need after click on item and then send information about this item to another Activity.

PlacesAdapter.java

public class PlacesAdapter extends RecyclerView.Adapter<PlacesViewHolder> {
private PlacesActivity placesActivity;

    Context context;
    private int position;
    List<Places> places;

    public PlacesAdapter(List<Places> places) {
        this.places = places;}

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

    @Override
    public PlacesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.places_view, viewGroup, false);
        PlacesViewHolder pvh = new PlacesViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(PlacesViewHolder personViewHolder, int i) {
        personViewHolder.name.setText(places.get(i).name);
        personViewHolder.address.setText(places.get(i).address);
        Picasso.with(personViewHolder.itemView.getContext())
                .load(places.get(i).photo)
                .into(personViewHolder.getPhoto());
       }

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

}

PlacesViewHolder.java

In this line "intent.putExtra(PlacesDetail.PLACES_NAME,);" How can I send name?

 public  class PlacesViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    public TextView name;
    public TextView address;
    public ImageView photo;
    public PlacesViewHolder(final View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        name = (TextView)itemView.findViewById(R.id.person_name);
        address = (TextView)itemView.findViewById(R.id.person_age);
        photo = (ImageView)itemView.findViewById(R.id.person_photo);

        itemView.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                Intent intent = new Intent(context, PlacesDetail.class);
                intent.putExtra(PlacesDetail.PLACES_NAME,);
                context.startActivity(intent);
            }
        });

    }

    public TextView getAddress() {
        return address;
    }

    public TextView getName() {
        return name;
    }
    public ImageView getPhoto() {
        return photo;
    }
}
like image 815
Alice Avatar asked Jun 11 '16 08:06

Alice


2 Answers

This is the complete example of custom Adapter where i'm able to get the details of particular items. In MainActivity you need to set the adapter :

adapter = new MyAdapter(getApplicationContext(), account_no, title, aFN1, aLN1,aFN2, aLN2,aFN3, aLN3,isavilable,waitlist,flag);
                            adapter.notifyDataSetChanged();
                            mRecyclerView.setAdapter(adapter);

Now see the code for the custom Adapter :

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    String TAG = "MyAdapter";
    Context context;
    private String[] accountNo;
    private String[] title;
    private String[] afn1;
    private String[] aln1;
    private String[] afn2;
    private String[] aln2;
    private String[] afn3;
    private String[] aln3;
    private String[] isAvailable;
    private String[] waitlist;
    private int flag;
 public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView account_no,title,afn1,afn2,aln1,aln2,color,is_available;
        private ImageView img_android;
        CardView cardView;
        public ViewHolder(CardView v) {
            super(v);
            account_no = (TextView)v.findViewById(R.id.acctno);
            title = (TextView)v.findViewById(R.id.title);
            afn1 = (TextView) v.findViewById(R.id.afn1);
            cardView = v;
        }
    }
    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(Context context, String[] accountNo,String[] title,String[] afn1,String[] aln1,String[] afn2,String[] aln2,String[] afn3,String[] aln3,String[] isAvailable, String[] waitlist,int flag) {
        this.context = context;
        this.accountNo = accountNo;
        this.title = title;
        this.afn1 = afn1;
        this.aln1 = aln1;
        this.afn2 = afn2;
        this.aln2 = aln2;
        this.afn3 = afn3;
        this.aln3 = aln3;
        this.isAvailable = isAvailable;
        this.waitlist = waitlist;
        this.flag = flag;
        Log.d(TAG,afn1.toString() +aln1+afn2+aln2+afn3+aln3.toString()+waitlist);
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        return new ViewHolder(cv);
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final CardView cardView = holder.cardView;
        final TextView accountno = (TextView)cardView.findViewById(R.id.acctno);
        accountno.setText(accountNo[position]);
        final TextView titletxt = (TextView)cardView.findViewById(R.id.title);
        titletxt.setText(title[position]);
        final TextView afn1txt = (TextView) cardView.findViewById(R.id.afn1);
        afn1txt.setText(afn1[position]+" "+aln1[position]);
        Log.d(TAG,waitlist[position]);
        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = getItemViewType(position);
                SharedPreferences sharedPreferences = context.getSharedPreferences(Constant.MYPREFERENCE,Context.MODE_PRIVATE);
                SharedPreferences.Editor edit = sharedPreferences.edit();
                edit.putString(Constant.ACCOUNT,accountNo[position]);
                edit.putString(Constant.TITLE,title[position]);
                edit.putString(Constant.AFN1,afn1[position]);
                edit.putString(Constant.ALN1,aln1[position]);
                edit.putString(Constant.AFN2,afn2[position]);
                edit.putString(Constant.ALN2,aln2[position]);
                edit.putString(Constant.AFN3,afn3[position]);
                edit.putString(Constant.ALN3,aln3[position]);
                edit.putBoolean(Constant.IS_AVAILABLE, Boolean.parseBoolean(isAvailable[position].toUpperCase()));
                edit.putString(Constant.WAITLIST,waitlist[position]);
                Log.d("WaitingNo2 :",""+String.valueOf(waitlist[position]));
                edit.commit();
                Intent intent = new Intent(v.getContext(), DetailsActivity.class);
                v.getContext().startActivity(intent);
            }
        });
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return accountNo.length;
    }
}

After All that get the value from sharedPreferences in the Activity which is called on Card Click:

preferences = getSharedPreferences("myshared", Context.MODE_PRIVATE);
AccountNo = sharedPreferences.getString(Constant.ACCOUNT,null).toUpperCase();
            title = sharedPreferences.getString(Constant.TITLE,null).toUpperCase();
            afn1 = sharedPreferences.getString(Constant.AFN1,null).toUpperCase();
            aln1 = sharedPreferences.getString(Constant.ALN1,null).toUpperCase();
            afn2 = sharedPreferences.getString(Constant.AFN2,null).toUpperCase();
            aln2 = sharedPreferences.getString(Constant.ALN2,null).toUpperCase();
            afn3 = sharedPreferences.getString(Constant.AFN3,null).toUpperCase();
            aln3 = sharedPreferences.getString(Constant.ALN3,null).toUpperCase();
            isAvailable = sharedPreferences.getBoolean(Constant.IS_AVAILABLE,isAvailable);
            waitlist = sharedPreferences.getString(Constant.WAITLIST,waitlist);

Now do whatever you want and enjoy the code.

like image 62
Sanjeev Sangral Avatar answered Oct 14 '22 04:10

Sanjeev Sangral


You can achieve this by creating an interface inside your adapter for an itemclicklistener and then you can set onItemClickListener from your PlacesActivity.

Somewhere inside your PlacesAdapter you would need the following:

private onRecyclerViewItemClickListener mItemClickListener;

 public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }

    public interface onRecyclerViewItemClickListener {
        void onItemClickListener(View view, int position, String places_name);
    }

Then inside your ViewHolder (which I've added as an inner class inside my adapter), you would apply the listener to the components you'd like the user to click, like so:

class PlacesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        PlacesViewHolder(View view) {
            super(view);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClickListener(v, getAdapterPosition(), PlacesDetail.PLACES_NAME);
            }
        }
    }

This example shows an onClickListener being applied to the view inside PlacesViewHolder.

recyclerView.setAdapter(adapter);// set adapter on recyclerview
            adapter.notifyDataSetChanged();// Notify the adapter
            adapter.setOnItemClickListener(new PlacesAdapter.onRecyclerViewItemClickListener() {
                @Override
                public void onItemClickListener(View view, int position, String places_name) { 
//perform click logic here (places_name is passed)
                    }
                });

To implement this code, you would setOnItemClickListener to your adapter inside PlacesActivity as shown above.

like image 44
BIW Avatar answered Oct 14 '22 03:10

BIW