RecyclerView相比与ListView的优点在于,ListView点击的是每个Item,但是每个Item中包含的控件是无法点击的,而RecyclerView每个Item的控件都是可以实现点击事件的。
接着上篇博文RecyclerView,我们只需修改FruitAdapter的代码即可:
package com.example.test;
import android.support.annotation.NonNull;
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 android.widget.Toast;
import java.util.List;
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
private List<Fruit>fruitList;
static class ViewHolder extends RecyclerView.ViewHolder{
View fruitview;//用来保存子项最外层布局的实例
ImageView fruitImage;
TextView fruitName;
public ViewHolder(View view){
super(view);
fruitview=view;
fruitImage=view.findViewById(R.id.fruit_image);
fruitName=view.findViewById(R.id.fruit_name);
}
}
public FruitAdapter(List<Fruit> fruitLists){
fruitList=fruitLists;
}
@NonNull
@Override//在onCreateViewHolder中注册点击事件
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fruit_item,viewGroup,false);
final ViewHolder viewHolder=new ViewHolder(view);
//为TextView注册点击事件
viewHolder.fruitName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=viewHolder.getAdapterPosition();//得到点击位置
Fruit fruit=fruitList.get(position);//由位置得到实例
Toast.makeText(v.getContext(),fruit.getName()+"名字",Toast.LENGTH_SHORT).show();
}
});
//为ImageView注册点击事件
viewHolder.fruitImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=viewHolder.getAdapterPosition();//得到点击的位置
Fruit fruit=fruitList.get(position);//得到实例
Toast.makeText(v.getContext(),fruit.getName()+"图",Toast.LENGTH_SHORT).show();
}
});
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
Fruit fruit=fruitList.get(i);
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
}
@Override
public int getItemCount() {
return fruitList.size();
}
}
在注册点击事件中,我们首先获取用户点击的位置(position),然后根据position拿到相应的Fruit实例。