步骤
adapter中
自定义一个继承自RecyclerView.Adapter的MyAdapter。
1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener
public static interface OnItemClickListener { void onItemClick(View view , int position); }
声明一个这个接口的变量
private OnItemClickListener mOnItemClickListener1 = null;
在onCreateViewHolder()中为每个item添加点击事件
@Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item1_t, null); myHolder = new MyHolder(view); //将创建的View注册点击事件 view.setOnClickListener(this); return myHolder; }
将点击事件转移给外面的调用者:
@Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取position mOnItemClickListener.onItemClick(v,(int)v.getTag()); } }
注意上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item的position
@Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item1_t, null); myHolder = new MyHolder(view); //将创建的View注册点击事件 view.setOnClickListener(this); return myHolder; }
最后暴露给外面的调用者,定义一个设置Listener的方法():
public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; }
以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。
在Activity中使用 这是做项目中的传值
rec.setOnItemClickListener(new ReclerAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Bundle bundle = new Bundle(); Intent intent = new Intent(getActivity(), XiangQingjieMian.class); String img_t = list_t.get(position).getImages(); String title = list_t.get(position).getTitle(); String price=list_t.get(position).getPrice()+""; bundle.putString("img_t",img_t); bundle.putString("title",title); bundle.putString("price",price); intent.putExtras(bundle); getActivity().startActivity(intent); } }); } });
完整代码
MyAdapter.java
package com.example.samsung.jddemo.Adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.example.samsung.jddemo.Bean.Grid_Bean2; import com.example.samsung.jddemo.R; import java.util.List; import it.sephiroth.android.library.picasso.Picasso; /** * Created by samsung on 2017/11/13. */ public class ReclerAdapter extends RecyclerView.Adapter<ReclerAdapter.MyHolder> implements View.OnClickListener{ private OnItemClickListener mOnItemClickListener1 = null; private List<Grid_Bean2.TuijianBean.ListBean> list_t; private Context context; private MyHolder myHolder; private OnItemClickListener mOnItemClickListener = null; @Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取position mOnItemClickListener.onItemClick(v,(int)v.getTag()); } } public static interface OnItemClickListener { void onItemClick(View view , int position); } public ReclerAdapter(Context context, List<Grid_Bean2.TuijianBean.ListBean> list_t) { this.context = context; this.list_t = list_t; } @Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item1_t, null); myHolder = new MyHolder(view); //将创建的View注册点击事件 view.setOnClickListener(this); return myHolder; } @Override public void onBindViewHolder(MyHolder holder, int position) { String images = list_t.get(position).getImages(); String[] split = images.split("\\|"); String imgurl = split[0]; myHolder.textView.setText(list_t.get(position).getTitle()); Picasso.with(context).load(imgurl).into(holder.imageView); //将position保存在itemView的Tag中,以便点击时进行获取 myHolder.itemView.setTag(position); } public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } @Override public int getItemCount() { return list_t == null ? 0 : list_t.size(); } public class MyHolder extends RecyclerView.ViewHolder { private final ImageView imageView; private final TextView textView; public MyHolder(View itemView) { super(itemView); imageView = (ImageView) itemView.findViewById(R.id.t_img); textView = (TextView) itemView.findViewById(R.id.tv_t); } } }