最终目的
模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据。
原理
为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。
步骤如下
首先在对应的适配器里面自定义接口 对应的点击 和长安点击
public OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener{
void onClick( int position);
void onLongClick( int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
this. mOnItemClickListener=onItemClickListener;
}
在对应的适配器的
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {}方法里面 进行 判断
最后 在对应的MainActivity里面进行 调用if( mOnItemClickListener!= null){ holder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); holder.itemView.setOnLongClickListener( new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onLongClick(position); return false; } }); }
homeadper.setOnItemClickListener(new HomeAdaper.OnItemClickListener() { @Override public void onClick(int position) { Toast.makeText(MainActivity.this,"您点击了"+position+"行",Toast.LENGTH_SHORT).show(); } @Override public void onLongClick(int position) { Toast.makeText(MainActivity.this,"您长按点击了"+position+"行",Toast.LENGTH_SHORT).show(); } });
为了方便大家 我把适配器 和MainActivity 复制到下方 ,提供给大家参考
适配器
public class HomeAdaper extends RecyclerView.Adapter{ Context context; List<News.ResultBean> list; public OnItemClickListener mOnItemClickListener; public interface OnItemClickListener{ void onClick( int position); void onLongClick( int position); } public void setOnItemClickListener(OnItemClickListener onItemClickListener ){ this. mOnItemClickListener=onItemClickListener; } public HomeAdaper(Context context, List<News.ResultBean> list) { this.context = context; this.list = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recycle,parent,false)); return holder; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { MyViewHolder holder1 = (MyViewHolder) holder; holder1.tv1.setText(list.get(position).getMarketName()); holder1.tv2.setText( list.get(position).getHigh()+""); holder1.tv3.setText(list.get(position).getLow()+""); holder1.tv4.setText( list.get(position).getLast()+""); holder1.tv5.setText( list.get(position).getVolume()+""); if( mOnItemClickListener!= null){ holder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); holder.itemView.setOnLongClickListener( new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onLongClick(position); return false; } }); } } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ TextView tv1,tv2,tv3,tv4,tv5; public MyViewHolder(View itemView) { super(itemView); tv1 = (TextView) itemView.findViewById(R.id.tv1); tv2 = (TextView) itemView.findViewById(R.id.tv2); tv3 = (TextView) itemView.findViewById(R.id.tv3); tv4 = (TextView) itemView.findViewById(R.id.tv4); tv5= (TextView) itemView.findViewById(R.id.tv5); } } }
MainActivity 页面
public class MainActivity extends AppCompatActivity implements IView { RecyclerView recycler; HomeAdaper homeadper; UserPresenter userPresenter; List<News.ResultBean> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recycler = (RecyclerView)findViewById(R.id.recylce); recycler.setLayoutManager(new LinearLayoutManager(this)); userPresenter = new UserPresenter(this); userPresenter.getUser(Api.HOME_URL); } @Override public void getNews(ArrayList<News.ResultBean> list) { recycler.setAdapter(homeadper =new HomeAdaper(MainActivity.this,list)); homeadper.setOnItemClickListener(new HomeAdaper.OnItemClickListener() { @Override public void onClick(int position) { Toast.makeText(MainActivity.this,"您点击了"+position+"行",Toast.LENGTH_SHORT).show(); } @Override public void onLongClick(int position) { Toast.makeText(MainActivity.this,"您长按点击了"+position+"行",Toast.LENGTH_SHORT).show(); } }); } }