RecyclerView 的点击事件:
对于RecyclerView来说,该控件没有给我们提供内置监听方法,我们需要在adapter中增加点击事件,来达到recyclerView的点击。
第一步:声明一个接口,定义响应事件的方法。
public interface OnRVItemClickListener { //定义点击事件的回调 void onItemClick(int pos); }第二步:在RecyclerView的adapter内来维护(声明)一个接口对象
//声明一个监听器对象 private OnRVItemClickListener onRVItemClickListener; //提供一个方法 public void setOnRVItemClickListener(OnRVItemClickListener onRvItemClicList){ this.onRVItemClickListener = onRvItemClicList;第三步:在OnBindVIewHolder方法中对item设置点击事件监听,并对事件传递给接口对象。
//在这里给item添加响应事件 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取点击的位置 int pos = holder.getLayoutPosition(); //传递点击位置 onRVItemClickListener.onItemClick(pos);第四步:在MainActivity中实现接口,并重写方法,实现内容。
//给adapter添加监听器 adapter.setOnRVItemClickListener(this);同时生成:
public void onItemClick(int pos) { Log.i("位置信息",pos+""); }
RecyclerView 加载不同的Item:
第一步:导包
第二步:在main.xml中添加 recyclerView
第三步:创建xml布局,进行对每个item进行布局(需要几个创建几个)。
第四步:创建数据
注意:在这写了个内部类,内部类里面有个构造方法(参数有数据还有数据的类型)
//创造数据 private void createData() { list= new ArrayList<>(); MyData data1 = new MyData("hey man",R.drawable.c1,0); MyData data2 = new MyData("hey girl",R.drawable.c2,1); MyData data3 = new MyData("what's up?",R.drawable.c2,1); MyData data4 = new MyData("I want a stronger man",R.drawable.c1,0); list.add(data1); list.add(data2); list.add(data3); list.add(data4); } class MyData{ String text; //标志消息的类型 int type; int image; //构造函数 public MyData(String text,int image, int type){ this.text = text; this.type = type; this.image= image;第五步:创建adapter 继承自RecyclerView.Adapter 并创建viewHolder继承自RecyclerView.V iewHolder:
adapter里面有四个方法:
1.把item的xml布局注入到mainActivity中。并把他放到行对应的holder里。
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType){ case 0 : View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item_0,null); MyViewHolder0 holder = new MyViewHolder0(view); return holder; case 1: View view1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item_1,null); MyViewHolder1 holder1 = new MyViewHolder1(view1); return holder1; } return null; }2.返回数据的类型(找到对应的viewholder)
public int getItemViewType(int position) { return list.get(position).type; }3.获取数据并把数据注入到viewholder里面
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //获取数据得到类型 MyData data = list.get(position); int type = data.type; switch (type){ case 0: MyViewHolder0 holder0 = (MyViewHolder0) holder; holder0.textView.setText(data.text); holder0.imageView.setImageResource(data.image); break; case 1: MyViewHolder1 holder1 = (MyViewHolder1) holder; holder1.textView.setText(data.text); holder1.imageView.setImageResource(data.image); break; }4.返回item的个数
public int getItemCount() { return list.size();创建ViewHolder:
根据item的个数创建ViewHolder的个数:(用来加载每个item里面的控件)
class MyViewHolder0 extends RecyclerView.ViewHolder{ TextView textView; ImageView imageView; public MyViewHolder0(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView1); imageView = (ImageView) itemView.findViewById(R.id.image1); } } class MyViewHolder1 extends RecyclerView.ViewHolder{ TextView textView; ImageView imageView; public MyViewHolder1(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.textView2); imageView = (ImageView) itemView.findViewById(R.id.image2); }