Android开发之RecyclerView的使用一

目录

1.写一个继承于RecyclerView.ViewHolder的类。

2.写一个继承RecyclerView.Adapter的适配器

3.布局

4.在Activity中使用RecyclerView。

LayoutManager的用法

StaggeredGridLayoutManager的用法

XRecyclerViewDivider的使用


1.写一个继承于RecyclerView.ViewHolder的类。

它可以接收一个 itemView 作为参数。在构造方法中,创建一个变量来引用 TextView,然后将它指向表项布局里对应的视图。然后自定义 bindDateToView() 函数,将数据和UI关联起来。

class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView textview;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        textview= (TextView) itemView.findViewById(R.id.textview);
    }
    public void bindDateToView(String s){
        textview.setText(s);
    }
}

2.写一个继承RecyclerView.Adapter的适配器

重写 onCreateViewHolder()。在该方法里进行初始化和填充 RecyclerView 中的表项视图。

    //创建每一行的View 用RecyclerView.ViewHolder包装
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView=inflater.inflate(R.layout.recycler_item,null);
        return new MyViewHolder(itemView);
    }

重写 onBindViewHolder()。onBindViewHolder() 被调用的时候,会传入参数 ViewHolder 和一个位置 (position),在这个方法中将数据传递给 ViewHolder的bindDateToView方法,来使数据绑定到对应的 UI。

 //每一行的View填充数据
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
       holder.bindDateToView(datas.get(position));
    }

重写 getItemCount(),RecyclerView 显示一个列表,所以它需要知道列表里共有多少项,因此返回数据源的长度。

    //数据的数量
    @Override
    public int getItemCount() {
        return datas.size();
    }

3.布局

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

4.在Activity中使用RecyclerView。

在创建了recyclerView对象后需要调用setLayoutManager方法添加布局管理器,同时需要addItemDecoration添加分割线,当然还要调用setAdapter设置适配器。

    private RecyclerView recyclerView;
    private List<String> datas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initData();
        recyclerView = findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));//设置布局管理器
        recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
        recyclerView.setAdapter(new RecyclerViewAdapter(this, datas));
    }

运行效果如下:

LayoutManager的用法

在RecyclerView中实现不同的列表,只需要切换不同的LayoutManager即可。RecyclerView.LayoutManager跟RecyclerView.ItemDecoration一样,都是RecyclerView静态抽象内部类,但是LayoutManager有三个官方写好的实现类。

  • LinearLayoutManager 线性布局管理器 跟ListView功能相似
  • GridLayoutManager 网格布局管理器 跟GridView功能相似
  • StaggeredGridLayoutManager 瀑布流布局管理器

刚刚我们用的是LinearLayoutManager,现在我们切换到GridLayoutManager。

recyclerView.setLayoutManager(new GridLayoutManager(this,2));

同时添加分割线

  recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
  recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.HORIZONTAL));

运行效果:

StaggeredGridLayoutManager的用法

在recyclerView中添加StaggeredGridLayoutManager,代码示例如下:

 //瀑布流效果
 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,LinearLayout.VERTICAL));
 recyclerView.setAdapter(new RecyclerViewAdapter(this, datas));

在数据源中保存高度值,在holder的bindDateToView中将获取的高度值设置到ItemView上,实现瀑布流效果。

public void bindDateToView(ItemData data){
        textview.setText(data.getStr());
        textview.setHeight(data.getHeight());
    }

瀑布流列表没有添加分割线,通过给item添加padding属性实现分割线的效果。

<?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"
    android:padding="5dp"
    android:background="@color/teal_200"
    >
    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/purple_200"
        android:gravity="center_vertical"
        android:paddingLeft="20dp"
        android:background="@color/white"
        />

</LinearLayout>

运行效果如下:

 

可以看出效果图中间的间隔比左右两边的宽,原因是每个Item都设置了上下左右的padding,导致两个相邻的Item中间就会更加的宽。

XRecyclerViewDivider的使用

XRecyclerViewDivider是一款很好用的分割线,解决了大部分的问题。这里说一下XRecyclerViewDivider的简单的用法。首先在项目中引入该库,在 Module build.gradle文件中添加:

dependencies {
    implementation 'com.github.HHotHeart:XRecyclerViewDivider:1.0.1'
    ...
}

在Project build.gradle文件中添加:

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

在activity中的使用如下:

  recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, LinearLayout.VERTICAL));
        XStaggeredGridBuilder itemDecoration =  new XStaggeredGridBuilder(this)
                //分割线间距,支持float dp 和DimenRes dp
                .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明
                .setVLineSpacing(8f)
                .setHLineSpacing(8f)
                //是否包括边界
                .setIncludeEdge(true)
                //是否忽略FullSpan的情况
                .setIgnoreFullSpan(true)
        ;
        recyclerView.addItemDecoration(itemDecoration.build());
        recyclerView.setAdapter(new RecyclerViewAdapter(this, datas));

运行效果如下,可以看出所有的间隔都是一样的,包括左右两边的间距:

XRecyclerViewDivider的 GitHub传送门

RecyclerView的简单使用就介绍到这里了,非常感谢,1024程序员节日快乐!

猜你喜欢

转载自blog.csdn.net/weixin_43858011/article/details/125102506