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 }