zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    用户体验
    jsp ini 配置文件
    Highcharts 图表
    简单游戏服务器
    js 数据操作
    jquery 导航
    as3.0 删除子元件
    java float 保留二位小数
    局域网ip
    SWFUpload
  • 原文地址:https://www.cnblogs.com/znjy/p/14905992.html
Copyright © 2011-2022 走看看