RecyclerView.ViewHolder中的onClickListener

时间:2016-06-11 08:22:01

标签: java android android-recyclerview onclicklistener

我有一个RecyclerView.ViewHolder和RecyclerView.Adapter,点击项目后我需要,然后将有关此项目的信息发送给另一个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

在这一行"intent.putExtra(PlacesDetail.PLACES_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;
    }
}

3 个答案:

答案 0 :(得分:1)

您可以通过在适配器内为itemclicklistener创建一个接口来实现此目的,然后您可以从onItemClickListener设置PlacesActivity

PlacesAdapter内的某处,您需要以下内容:

private onRecyclerViewItemClickListener mItemClickListener;

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

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

然后在ViewHolder(我已经在我的适配器中添加内部类)中,您可以将侦听器应用于您希望用户单击的组件,如下所示:

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

此示例显示onClickListener被应用于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)
                    }
                });

要实现此代码,您应setOnItemClickListener PlacesActivity内的适配器,如上所示。

答案 1 :(得分:1)

这是自定义适配器的完整示例,我可以获取特定项目的详细信息。在MainActivity中,您需要设置适配器:

adapter = new MyAdapter(getApplicationContext(), account_no, title, aFN1, aLN1,aFN2, aLN2,aFN3, aLN3,isavilable,waitlist,flag);
                            adapter.notifyDataSetChanged();
                            mRecyclerView.setAdapter(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获取来自在Card Click上调用的Activity中的sharedPreferences的值:

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

现在做任何你想做的事情并享受代码。

答案 2 :(得分:0)

试试这个,它正确地与我合作

创建一个新类和此代码

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;

public interface OnItemClickListener {
    public void onItemClick(View view, int position);

    public void onLongItemClick(View view, int position);
}

GestureDetector mGestureDetector;

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}

@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }

@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
} 

在您的Activity中将此添加到您的适配器实现

mRecyclerView.addOnItemTouchListener(
    new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
    // do something
    }
    }
    }

@Override
public void onLongItemClick(View view, int position) {
    // do whatever
    }
    })
    );