目的
實現如listview的點擊事件的效果
原理
爲RecyclerView的每個子item設置setOnClickListener,然後在onClick中再調用一次對外封裝的接口,將這個事件傳遞給外面的調用者。而“爲RecyclerView的每個子item設置setOnClickListener”在Adapter中設置。其實直接在onClick中也能完全處理item的點擊事件,但是這樣會破壞代碼的邏輯。
第一步創建點擊接口
public static interface OnItemClickListener {
void onItemClick(View view, int position);
}
**第二步聲明接口
private OnItemClickListener mOnItemClickListener = null;
第三添加set方法
public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
**第四實現將點擊事件轉移給外面的調用者:
implements View.OnClickListener
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意這裏使用getTag方法獲取position
mOnItemClickListener.onItemClick(v, (int) v.getTag());
}
}
第五綁定點擊事件
@Override
public HomeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(
context).inflate(R.layout.layout, parent,
false);
MyViewHolder holder = new MyViewHolder(inflate);
//將創建的View註冊點擊事件
inflate.setOnClickListener(this);
return holder;
}
第六 將position保存在itemView的Tag中,以便點擊時進行獲取
@Override
public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {
holder.tv.setText(ad5.get(position).getTitle());
// Glide.with(context).load(ad5.get(position).getImage()).into(holder.imageView);
// https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png
Uri uri = Uri.parse(ad5.get(position).getImg());
holder.imageView.setImageURI(uri);
//將position保存在itemView的Tag中,以便點擊時進行獲取
holder.itemView.setTag(position);
}
調用
adapter.setmOnItemClickListener(new HomeAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.e("aaa", "onItemClick: "+position );
}
});
完整adapter
import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.wyj.test.zhoukao2lx.R;
import com.wyj.test.zhoukao2lx.bean.ZKBean;
import java.util.List;
/**
* Created by wangyajie on 2017/11/11.
*/
public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> implements View.OnClickListener{
Context context;
List<ZKBean.DataBean> ad5;
private OnItemClickListener mOnItemClickListener = null;
public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
@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 HomeAdapter(Context context, List<ZKBean.DataBean> ad5) {
this.context = context;
this.ad5 = ad5;
}
@Override
public HomeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(
context).inflate(R.layout.layout, parent,
false);
MyViewHolder holder = new MyViewHolder(inflate);
//將創建的View註冊點擊事件
inflate.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {
holder.tv.setText(ad5.get(position).getTitle());
Uri uri = Uri.parse(ad5.get(position).getImg());
holder.imageView.setImageURI(uri);
//將position保存在itemView的Tag中,以便點擊時進行獲取
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return ad5.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
ImageView imageView;
public MyViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.tv);
imageView = (ImageView) view.findViewById(R.id.my_image_view);
}
}
}