欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安卓学习之路-RecyclerView的简单用法

程序员文章站 2022-06-14 11:18:07
...

日常唠嗑

唔,今天早上想了很多,主要是想自己能不能通过面试得到工作。于是乎就跑到力扣看了看,好吧,我好像对算法啥的还是小白啊,瞬间就有点慌,担心会被问到(同学告诉我这是一定会问到的),小小的沮丧了一下,不过还是想着,无论如何,遇到困难遇到不会的,那就学吧,抓紧时间学习才是正道啊,一味地抱怨沮丧只会让自己走歪。
好吧,唠嗑完了回归正题。其实RecyclerView我之前有简单的提一下,但是还是重新来好了!

RecyclerView

这是一个类似ListView一样的列表控件,但是功能却极其强大,可以说是增强版的ListView,相比ListView,它的性能更加出色,也支持横向滚动、瀑布滚动等,而且在子项点击事件上的处理更出色。

用法

我对照着《第一行代码》打了一个简单的项目
在这里再次赞叹《第一行代码》是真的启蒙神书啊。
这是一个远程库,所以我们需要添加依赖才能使用。
添加依赖的方法:
来自大佬的教导:基于sdk28使用Android Studio创建RecyclerView实例,使用androidx导入recyclerView
大佬的教导开篇就是了,就不多说了。
老思路,一个控件的使用包括布局和逻辑。

一、布局

步骤就是

  • 1、在主布局中引入控件
  • 2、编写好子项布局

第一步:主要是在主布局中引入RecyclerView控件。

注意:因为是远程导入的,所以需要把完整的包名写出来
activity_main.xml

<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recycler_view">

</androidx.recyclerview.widget.RecyclerView>

第二步:然后在子布局中,写好自己的子项布局

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="wrap_content"
    android:layout_height="wrap_content">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_image"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_name"/>

</LinearLayout>

到这儿布局基本完成,剩下的就是编写逻辑代码了

二、代码

步骤就是

  • 1、编写实体类
  • 2、创建适配器
  • 3、在主活动中使用

第一步:编写实体类

这个主要是看你想做一个怎么样的项目来定,以书上为例子,做一个左边显示水果图片,右边显示水果名的简单项目,就需要水果名与图片id
Fruit.java

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;
    }
}

小tips:在编写实体类的时候,我们只需要把需要的属性写出来,最好把属性都设置为private。这是一个编程习惯,可以对数据进行有效保护。然后编写构造函数以及get set方法时,使用快捷键alt+ins 就可以快速生成了!

第二步:创建适配器

  • 1、创建一个新类:FruitAdapter继承RecyclerView.Adapter,并且将泛型指定为FruitAdapter.ViewHolder。
    一开始这么写会报错,因为ViewHolder是一个内部类,我们还没有定义。所以接下来我们就定义内部类。这个内部类的作用主要是通过传入的一个参数view,从而获取RecyclerView子项的最外层布局,然后通过findViewById()方法获取控件的实例(在本例子中获取的是ImageView和TextView)。
  • 2、定义全局变量mFruitList,生成构造函数。
    这个构造函数是用来把要展示的数据源(水果图片、水果名字)传进来,并赋值给mFruitList。
  • 3、重写onCreateViewHolder()方法
    这个函数主要是用来加载子项布局(fruit_item),然后创建ViewHolder实例并把子项布局传入到构造函数中,最后返回ViewHolder实例。
  • 4、重写onBindViewHolder()方法
    这个方法是用来对传入的子项布局进行赋值的,也就是说当子项布局被传入进来,是它让布局有了水果名、水果图片。它会在每个布局被滚动到屏幕的时候执行。在本例子中,是通过position参数得到当前项的Fruit实例,然后再把数据设置到ViewHolder的ImageView和TextView里。
  • 5、重写getItemCount()方法
    这个方法主要是用来返回数据源的长度,也就是告诉RecyclerView他有多少个子项
    奇怪的是我在我的AS里按Ctrl+O重写方法里没找到这个方法,还是自己手打才有的,百度也没找到问题所在= =。
    FruitAdapter.java
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    private List<Fruit> mFruitList;
    static class ViewHolder extends RecyclerView.ViewHolder{
        ImageView fruitImage;
        TextView fruitName;

        public ViewHolder(@NonNull View view) {
            super(view);
            fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
            fruitName = (TextView)view.findViewById(R.id.fruit_name);
        }
    }

    public FruitAdapter(List<Fruit> mFruitList) {
        this.mFruitList = mFruitList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull 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();
    }
}

第三步:在主活动中使用

  • 1、获取RecyclerView的实例
  • 2、创建LinearLayoutManager对象
  • 3、创建FruitAdapter实例
  • 4、将水果数据传入FruitAdapter的构造函数中
  • 5、调用setAdapter()方法完成适配器设置
    我没有设置数据库,所以就和书上一样自己随便弄了点数据上去。
    MainActivity.java
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);
        initFruit();
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        FruitAdapter fruitAdapter = new FruitAdapter(fruitList);
        recyclerView.setAdapter(fruitAdapter);
    }

    private void initFruit() {
        for(int i =5;i>0;i--){
            Fruit orange = new Fruit("orange",R.drawable.juzi);
            fruitList.add(orange);
            Fruit waterMelon = new Fruit("waterMelon",R.drawable.xigua);
            fruitList.add(waterMelon);
            Fruit apple = new Fruit("apple",R.drawable.pingguo);
            fruitList.add(apple);

        }
    }
}

效果:
安卓学习之路-RecyclerView的简单用法
平平无奇,但是相对于ListView而言,他少了很多优化的步骤,但是效率却也不错。

三、横向滚动与瀑布滚动

简单地看了一下,横向滚动就是把布局改一下,然后再MainActivity.java里加入了一行代码。瀑布滚动稍微多了一点步骤,但是我感觉我的时间不太够,就暂时作为了解,日后需要时再仔细学习吧。

四、点击事件

前面也有提到,RecyclerView的点击事件比ListView的点击事件更精确。拿这个例子来说。假如我是用的是ListView,那么我点击子项的时候,无论我点击图片还是文字,他都只知道,我点击了子项。但是如果使用的是RecyclerView,他就可以准确地判断出我点击了文字还是图片!
修改代码其实也很简单,只用修改适配器里的代码。主要是给最外层布局和图片加了点击事件,所以点击图片的时候会有Toast,点击文字的时候因为没有给文字注册点击事件,所以会被最外层布局捕捉到,相当于点击了最外层布局。
FruitAdapter.java

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    private List<Fruit> mFruitList;
    static class ViewHolder extends RecyclerView.ViewHolder{
        View fruitView;
        ImageView fruitImage;
        TextView fruitName;

        public ViewHolder(@NonNull View view) {
            super(view);
            fruitView = view;
            fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
            fruitName = (TextView)view.findViewById(R.id.fruit_name);
        }
    }

    public FruitAdapter(List<Fruit> mFruitList) {
        this.mFruitList = mFruitList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
        final ViewHolder viewHolder = new ViewHolder(view);
        viewHolder.fruitView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = viewHolder.getAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(v.getContext(), "你点击了这个布局", Toast.LENGTH_SHORT).show();
                
            }
        });
        viewHolder.fruitImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = viewHolder.getAdapterPosition();
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(v.getContext(), "你点击了图片", Toast.LENGTH_SHORT).show();
            }
        });
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull 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();
    }
}

看看效果:
点击文字:
安卓学习之路-RecyclerView的简单用法
点击图片:
安卓学习之路-RecyclerView的简单用法
至此,简单的RecyclerView的用法就写完了。

碎碎念

感觉时间真的不够啦,一天学一样似乎不太够时间了呢,毕竟还有算法没有弄啊,而且感觉算法也不是一朝一夕的事,但是不管怎么样,不要泄气,好好加油学习吧。
最近有时候总会觉得学习不想学习,玩也不想玩,就一直在发呆,很浪费时间,昨天就想通了,玩的时候就用心玩,学的时候也认真学,有时候不逼一下自己,你都不知道自己的潜力,接下来还有时间,不要想有的别的,前进!