RecyclerView的点击事件
1.声明一个接口,定义响应事件方法
RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件
public interface OnRVItemClickListener {
//定义点击事件的回调
void onItemClick(int pos);
}
2.在RecycView的Adapter内来维护(声明)一个接口对象
声明一个监听器对象
private OnRVItemClickListener onRVItemClickListener;
提供一个方法,设置监听器
public void setOnRVItemClickListener(OnRVItemClickListener onRVItemClickListener){
this.onRVItemClickListener = onRVItemClickListener;
}
3.在OnBindViewHolder方法中对Item设置点击事件监听,并将事件传递给接口对象
在这里给Item添加响应事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
获取点击的位置
int pos = holder.getLayoutPosition();
传递点击位置
onRVItemClickListener.onItemClick(pos);
}
});
4.在MainActivity中实现接口,并重写方法,实现内容
给Adapter添加监听器
adapter.setOnRVItemClickListener(this);
public void onItemClick(int pos) {
}
RecyclerView加载不同的Item
1.新建两个布局
2.在当前Activity的布局中添加一个RecyclerView的控件,添加布局管理器
3.新建一个JavaBean的类用来设置数据
设置数据
private void createData() {
mList = new ArrayList<>();
MyData data1 = new MyData("hey man", R.drawable.c9, 0);
MyData data2 = new MyData("hey girl", R.drawable.c10, 1);
mList.add(data1);
mList.add(data2);
}
class MyData {
String text;
Integer image;
标志消息的类型
int type;
public MyData(String text, Integer image, int type) {
this.text = text;
this.type = type;
this.image = image;
}
4.新建一个Adapter的类继承RecyclerView.Adapter
重写Adapter的三个方法
重写getItemViewType的方法,该方法决定了item的类型
创建一个Adapter
class MyAdapter extends RecyclerView.Adapter {
方法1:
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder = null;
switch (viewType) {
case 0:
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item_0, null);
holder = new MyViewHolder0(view);
return holder;
break;
case 1:
View view1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item1, null);
holder = new MyViewHolder1(view1);
return holder1;
break;
}
return holder;
}
***返回ViewHolder的类型,该方法决定了item的类型***
决定元素的布局使用哪种类型
position 数据源的下标
return 一个int型标志,传递给onCreateViewHolder的第二个参数
public int getItemViewType(int position) {
return mList.get(position).type;
}
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
获取数据得到类型
MyData data = mList.get(position);
int type = data.type;
switch (type) {
case 0:
MyViewHolder0 holder0 = (MyViewHolder0) holder;
holder0.textView.setText(data.text);
holder0.imageView0.setImageResource(data.image);
break;
case 1:
MyViewHolder1 holder1 = (MyViewHolder1) holder;
holder1.textView.setText(data.text);
holder1.imageView1.setImageResource(data.image);
break;
}
}
public int getItemCount() {
return mList.size();
}
}
5.在Adapter里就需要有两个ViewHolder,
分别声明不同布局Item
class MyViewHolder0 extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView0;
第一个ViewHolder
public MyViewHolder0(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView);
imageView0 = (ImageView) itemView.findViewById(R.id.item0_iv);
}
}
第二个ViewHolder
class MyViewHolder1 extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView1;
public MyViewHolder1(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.textView2);
imageView1 = (ImageView) itemView.findViewById(R.id.item1_iv);
}
}
}