添加依赖
implementation 'com.android.support:recyclerview-v7:27.1.1'
创建RecyclerView适配器
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
private List<Fruit> mFruitList;
static class ViewHolder extends RecyclerView.ViewHolder{
AppCompatImageView fruitImage;
AppCompatTextView fruitName;
public ViewHolder(View view) {
super(view);
fruitImage = view.findViewById(R.id.fruit_image);
fruitName = view.findViewById(R.id.fruit_name);
}
}
public FruitAdapter(List<Fruit> fruitList) {
this.mFruitList = fruitList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Fruit fruit = mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getName());
}
@Override
public int getItemCount() {
return mFruitList.size();
}
}
定义内部类ViewHolder,继承自RecyclerView.ViewHolder.ViewHolder的构造参数中传入一个View参数,这个参数通常就是RecyclerView子项的最外层布局。那么就可以通过findVIewById()方法来获取控件实例。
RecyclerView使用
RecyclerView recyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(manager);
FruitAdapter adapter = new FruitAdapter(fruitList);
recyclerView.setAdapter(adapter);
LayoutManager指定RecyclerView的布局方式,setOrientation()指定布局横向排列
为什么ListView很难或者根本无法实现的效果在RecyclerView上很容易实现呢?这是因为ListView的布局是有自身去管理的,而RecyclerView则将这个工作交给了LayoutManager,LayoutManager中制定了一套可扩展的布局排列接口,子类只要按照接口规范来实现,就能定制出各种不同排列方式的布局了。除了LinearLayoutManager外,RecyclerView还提供了网络布局GridLayoutManager,和瀑布流布局StaggeredGriedLayoutManager.