安卓开发:RecyclerView的使用(一)

“走路要牵着我呀 小时候老师没有跟你说过贵重物品要随身携带吗”


查看文章:

  1. 安卓开发:RecyclerView的使用(一)
  2. 安卓开发:RecyclerView的使用(二)
  3. 安卓开发:RecyclerView的使用(三)

RecyclerView 的基本用法

打开 app/build.gradle 文件,在 dependencies 闭包中添加如下内容:

compile 'com.android.support:recyclerview-v7:24.2.1' 

添加完之后记得要点击一下 Sync Now 来进行同步。然后修改 activity_main.xml 中的代码, 如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
     <android.support.v7.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
</LinearLayout>

新建Fruit 类和 fruit_item.xml,代码如下所示:

public class Fruit {
     private String name;
     private int imageId; 
     public Fruit(String name, int imageId) {
         this.name = name;
         this.imageId = imageId;
     }
     public String getName() {
         return name;
     }
     public int getImageId() {
         return imageId;
     }
} 

Fruit 类中只有两个字段,name 表示水果的名字,imageId 表示水果对应图片的资源 id。

然后需要指定一个我们自定义的布局,在layout目录下新建fruit_item.xml, 代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
     <ImageView
         android:id="@+id/fruit_image"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />
     <TextView
         android:id="@+id/fruit_name"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
         android:layout_marginLeft="10dp" />
</LinearLayout> 

接下来需要为 RecyclerView 准备一个适配器,新建 FruitAdapter 类,让这个适配器继承自 RecyclerView.Adapter,并将泛型指定为 FruitAdapter.ViewHolder。其中,ViewHolder 是我们在 FruitAdapter 中定义的一个内部类,代码如下所示:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
     private List<Fruit> mFruitList;
     static class ViewHolder extends RecyclerView.ViewHolder {
         ImageView fruitImage;
         TextView fruitName;
         public ViewHolder(View view) {
             super(view);
             fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
             fruitName = (TextView) view.findViewById(R.id.fruit_name);
         }
     }
     public FruitAdapter(List<Fruit> fruitList) {
         mFruitList = fruitList;
     }
     @Override
     public ViewHolder onCreateViewHolder(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(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,ViewHolder 要继承自 RecyclerView.ViewHolder。然后 ViewHolder 的构造函数中要传入一个 View 参数,这个参数通常就是 RecyclerView 子项的最外层布局,那么我们就可以通过 findViewById()方法来获取到布局中的 ImageView 和 TextView 的实例了。

接着往下看,FruitAdapter 中也有一个构造函数,这个方法用于把要展示的数据源传进来, 并赋值给一个全局变量 mFruitList,我们后续的操作都将在这个数据源的基础上进行。

继续往下看,由于 FruitAdapter 是继承自 RecyclerView.Adapter 的,那么就必须重写 onCreateViewHolder()、onBindViewHolder()和 getItemCount()这 3 个方法。onCreateViewHolder()方法是用于创建 ViewHolder 实例的,我们在这个方法中将 fruit_item 布局加载 进来,然后创建一个 ViewHolder 实例,并把加载出来的布局传入到构造函数当中,最后将 ViewHolder 的实例返回。onBindViewHolder()方法是用于对 RecyclerView 子项的数据进行赋值 的,会在每个子项被滚动到屏幕内的时候执行,这里我们通过 position 参数得到当前项的 Fruit 实例,然后再将数据设置到 ViewHolder 的 ImageView 和 TextView 当中即可。getItemCount() 方法就非常简单了,它用于告诉 RecyclerView 一共有多少子项,直接返回数据源的长度就可以了。

适配器准备好了之后,我们就可以开始使用 RecyclerView 了,修改 MainActivity 中的代码, 如下所示:

public class MainActivity extends AppCompatActivity {
     private List<Fruit> fruitList = new ArrayList<>();
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         initFruits(); // 初始化水果数据
         RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
         recyclerView.setLayoutManager(layoutManager);
         FruitAdapter adapter = new FruitAdapter(fruitList);
         recyclerView.setAdapter(adapter);
     }
     private void initFruits() {
         for (int i = 0; i < 2; i++) {
             Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
             fruitList.add(apple);
             Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
             fruitList.add(banana);
             Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
             fruitList.add(orange);
             Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
             fruitList.add(watermelon);
             Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
             fruitList.add(pear);
             Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
             fruitList.add(grape);
             Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
             fruitList.add(pineapple);
             Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
             fruitList.add(strawberry);
             Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
             fruitList.add(cherry);
             Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
             fruitList.add(mango);
         }
     }
} 

可以看到,这里使用了一个同样的 initFruits()方法,用于初始化所有的水果数据。接着 在 onCreate()方法中我们先获取到 RecyclerView 的实例,然后创建了一个 LinearLayoutManager 对象,并将它设置到 RecyclerView 当中。LayoutManager 用于指定 RecyclerView 的布局 方式,这里使用的 LinearLayoutManager 是线性布局的意思,可以实现和 ListView 类似的效果。 接下来我们创建了 FruitAdapter 的实例,并将水果数据传入到 FruitAdapter 的构造函数中, 最后调用 RecyclerView 的 setAdapter()方法来完成适配器设置,这样 RecyclerView 和数据之间 的关联就建立完成了。

转载声明:此篇文章转载自郭霖作者写的《第一行代码》书中的章节,因为此章节对我帮助很大,并且写的非常详细,以便之后方便查阅。特在此做转载声明。

猜你喜欢

转载自blog.csdn.net/qq_38717971/article/details/83378156