添加依赖
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.