RecyclerView
参考:《第一行代码》第二版——郭霖
可以用RecyclerView来显示多行列表。
recycle 循环回收再利用。
通过一个水果列表来学习RecyclerView
-
准备工作,在app/build.gradle文件中导入依赖
dependencies {implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.2.1'implementation 'androidx.constraintlayout:constraintlayout:2.0.1'implementation 'androidx.recyclerview:recyclerview:1.0.0'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }可以看到recyclerview在androidx里。
-
首先构建一个水果类,其中包括了要显示的水果内容——名称与图片
Fruit.javapackage com.chinabird.recycler;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 void setName(String name) {this.name = name;}public int getImageId() {return imageId;}public void setImageId(int imageId) {this.imageId = imageId;} } -
在xml文件中加入Recyclerview,相当于容器装东西
activity_main.xml<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!--写入完整包名--><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout> -
写出fruit的xml布局,要显示的列表样式
fruit_item.xml<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><!--水果图片--><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content" /><!--水果名称--><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginTop="10dp"/> </LinearLayout> -
为RecyclerVirew准备一个适配器,适配的是fruit_item
package com.example.recycler;import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;import java.util.List;import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView;/*** 继承自RecyclerView.Adapter实现类,泛型是其内部类*/ public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {/*全局Friut的List数组*/private List<Fruit> mFruitList;/*** 构造器*/public FruitAdapter(List<Fruit> mFruitList) {this.mFruitList = mFruitList;}/*** 内部类也继承其内部类,并重写构造器*/static class ViewHolder extends RecyclerView.ViewHolder {ImageView fruitImage;TextView fruitName;/*** 内部类构造器** @param view Recycler子项的最外层布局*/public ViewHolder(View view) {super(view);fruitImage = view.findViewById(R.id.fruit_image);fruitName = view.findViewById(R.id.fruit_name);}}/*第二个被回调,创建一个ViewHolder对象返回*/@NonNull@Overridepublic 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;}/*** 子项数据赋值,通过这个方法实现滑动添加,第三个被回调** @param holder* @param position*/@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {/*得到当前fruit*/Fruit fruit = mFruitList.get(position);/*更改图片*/holder.fruitImage.setImageResource(fruit.getImageId());/*更改文字*/holder.fruitName.setText(fruit.getName());}/*** @return 获取长度,第一个被回调*/@Overrdepublic int getItemCount() {return mFruitList.size();} } -
在MainActivity中进行Recycler的显示,并调用适配器填充内容
package com.example.recycler;import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import java.util.ArrayList; import java.util.List;public class MainActivity extends AppCompatActivity {private List<Fruit> mFruitList = new ArrayList<Fruit>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();/*找到activity_main.xml中的recyclerView*/RecyclerView recyclerView = findViewById(R.id.recycler_view);/*指定RecyclerView布局方式*/LinearLayoutManager layoutManager = new LinearLayoutManager(this);/*指定为LinearLayout布局*/recyclerView.setLayoutManager(layoutManager);/*适配去管理滑动显示*/FruitAdapter adapter = new FruitAdapter(mFruitList);/*设置适配*/recyclerView.setAdapter(adapter);}/*** 初始化40个苹果数组*/private void initFruits(){for (int i = 0; i < 40; i++) {Fruit apple = new Fruit("Apple" + i, R.mipmap.ic_launcher);mFruitList.add(apple);}} }

















