Android学习——RecyclerView

istView只能实现数据纵向滚动的效果,如果我们想实现横向滚动的话,ListView是做不到的。

Android提供了一个更强大的滚动控件——RecyclerView。它可以说是一个增强版的ListView,不仅可以轻松实现和ListView同样的效果,还优化了ListView中存在的各种不足之处。

RecyclerView的基本用法

首先在项目的build.gradle中添加相应的依赖库

打开app/build.gradle,在dependencies闭包中添加以下内容,添加完之后点击Sync Now进行同步

1 dependencies {
2     implementation fileTree(dir: 'libs',includes: ['*.jar'])
3     implementation 'androidx.appcompat:appcompat:1.0.0'
4     implementation 'androidx.recyclerview:recyclerview:1.0.0'
5     testImplementation 'junit:junit:4.12'
6 }

修改activity_main.xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:app="http://schemas.android.com/apk/res-auto"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     tools:context=".MainActivity">
 7     //由于RecyclerView并不是内置在系统SDK中,所以需要把完整的包路径写出来
 8    <androidx.recyclerview.widget.RecyclerView
 9        android:id="@+id/relative_view"
10        android:layout_width="match_parent"
11        android:layout_height="match_parent"/>
12 </LinearLayout>

将写在ListView项目的Fruit类和fruit_item.xml也复制过来,接下来为RecyclerView准备一个适配器,新建FruitAdapter类,让其继承自RecursiveAction.Adapter, ViewHolder是在FruitAdapter中定义的一个内置类

 1 public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
 2     //定义一个全局变量
 3     private List<Fruit> mFruitList;
 4     //定义一个内部类ViewHolder,ViewHolder要继承RecyclerView.ViewHolder
 5     static class ViewHolder extends RecyclerView.ViewHolder{
 6         ImageView fruitImage;
 7         TextView fruitName;
 8         //构造函数中要传入一个View参数,这个参数通常是RecyclerView子项的最外层布局,
 9         // 那么就可以通过findViewById()方法来获取到不居中的ImageView和TextView的实例了
10         public ViewHolder(View view){
11             super(view);
12             fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
13             fruitName = (TextView) view.findViewById(R.id.fruit_name);
14         }
15     }
16     //FruitAdapter中也有一个构造函数,这个方法用于把展示的数据源传进来,并赋值给一个全局变量mFruitList,后        续操作都在这个数据源上进行
17     public FruitAdapter(List<Fruit> fruitList){
18         mFruitList = fruitList;
19     }
20     //由于RecyclerView继承自RecyclerView.Adapter,那么就必须重写onCreateViewHolder(),onBindViewHolder(),getItemCount()方法
21     //onCreateViewHolder()方法用于创建ViewHolder实例,
22     //在这个方法内将fruit_item布局加载进来,然后创建一个ViewHolder实例,并将加载出来的布局传入构造函数中,        最后将ViewHolder实例返回
23     @Override
24     public ViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
25         View view=                                         LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
26         ViewHolder holder = new ViewHolder(view);
27         return holder;
28     }
29     //onBindViewHolder()方法是用于对RecyclerView子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行,
30     // 这里通过position参数的到当前项的Friut实例,然后再将数据设置到ViewHolder的ImageView和TextView中
31     @Override
32     public void onBindViewHolder(ViewHolder holder, int position) {
33         Fruit fruit = mFruitList.get(position);
34         holder.fruitImage.setImageResource(fruit.getImageId());
35         holder.fruitName.setText(fruit.getName());
36     }
37 
38     //getItemCount()方法用于告诉RecyclerView一共有多少子项,直接返回数据源的长度
39     @Override
40     public int getItemCount() {
41        return mFruitList.size();
42     }
43 }

修改MainActivity,使用RecyclerView

 1 public class MainActivity extends AppCompatActivity {
 2     
 3     private List<Fruit> fruitList = new ArrayList<>();
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         //初始化所有水果的数据
10         initFruits();
11         //获取RecyclerView实例
12         RecyclerView recyclerView = findViewById(R.id.relative_view);
13         //创建一个LinearLayoutManager对象并将他设置到RecyclerView中,LayoutManager用于制定布局方式,LinearLayoutManager是线性布局的意思,可以实现与ListView相似的效果
14         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
15         recyclerView.setLayoutManager(layoutManager);
16         //创建FruitAdapter实例,并将水果数据传入FruitAdapter的构造函数中
17         FruitAdapter adapter = new FruitAdapter(fruitList);
18         //最后调用setAdapter()方法完成适配器设置
19           recyclerView.setAdapter(adapter);
20     }
21     private  void initFruits(){
22         for (int i = 0;i<2;i++){
23             Fruit apple = new Fruit("Apple",R.drawable.apple);
24             fruitList.add(apple);
25             Fruit banner = new Fruit("Banner",R.drawable.banner);
26             fruitList.add(banner);
27             Fruit orange = new Fruit("Orange",R.drawable.orange);
28             fruitList.add(orange);
29             Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon);
30             fruitList.add(watermelon);
31             Fruit pear = new Fruit("Pear",R.drawable.pear);
32             fruitList.add(pear);
33             Fruit grape = new Fruit("Grape",R.drawable.grape);
34             fruitList.add(grape);
35             Fruit pineapple = new Fruit("Pineapple",R.drawable.pineapple);
36             fruitList.add(pineapple);
37             Fruit strawberry = new Fruit("Strawberry",R.drawable.strawberry);
38             fruitList.add(strawberry);
39             Fruit cherry = new Fruit("Cherry",R.drawable.cherry);
40             fruitList.add(cherry);
41             Fruit mango = new Fruit("Mango",R.drawable.mango);
42             fruitList.add(mango);
43 
44         }
45     }
46 }
原文地址:https://www.cnblogs.com/znjy/p/14905992.html