美文网首页Android旅途
Android数据列表之RecyclerView的使用

Android数据列表之RecyclerView的使用

作者: 朝阳小麦 | 来源:发表于2018-09-26 14:52 被阅读20次

适用人群:Android开发人员。
本文内容:简要介绍RecycleView的使用。包括:初接触RecyclerView;设置布局管理器;

PS:之前ListView和GrideView的介绍都是Demo写好了直接粘贴代码,这次边自学边写。最后还是会附上全部代码的。并且,在学习RecycleView之前最好起码先去了解下ListView的使用。

备注:
1.Android数据列表之ListView的使用:https://www.jianshu.com/p/d32cb10d78d9
2.Android数据列表之GrideView的使用:https://www.jianshu.com/p/9aa90798c1fb

文章目录:
一、初接触RecyclerView
二、设置布局管理器LayoutManager
三、全部代码如下

一、初接触RecyclerView

使用步骤如下:

1. 新建项目。添加控件发现找不到RecyclerView?新建的工程是不包含RecyclerView控件的,需要导包。通过导入support-v7对其进行使用。

1)Windows版本AndroidStudio导包步骤:

导包步骤-1
导包步骤-2.png
导包步骤-3.png
导包步骤-4.png

2)Mac版本AndroidStudio导包步骤:

导包步骤-1
导包步骤-2
导包步骤-3
导包步骤-4

2. 在activity_main.xml布局中删掉自带的“Hello world”TextView控件,添加一个RecyclerView控件。
新建项目默认的是约束布局ConstraintLayout,就以这种布局写。
控件id为recycler_view。

<android.support.v7.widget.RecyclerView
  android:id="@+id/recycler_view"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layout_constraintBottom_toBottomOf="parent"
  app:layout_constraintTop_toTopOf="parent"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent">
></android.support.v7.widget.RecyclerView>

3.创建一个适配器类MyRecyclerAdapter
GridView和ListView都是继承自BaseAdapter,但是RecyclerView不同,继承自RecyclerView.Adapter。右击包,新建java类,父类输入Adapter,会自动出来是recycler包下的Adapter,选择,创建。

创建适配器-1 创建适配器-2

新建的类是空的,需要重写父类方法。

public class MyRecyclerAdapter extends RecyclerView.Adapter {
//在这里右击
}

如何重写父类方法?
在类花括号里面右击,后续步骤如下图:

重写父类方法-1
重写父类方法-2

这里,我重写了一些必要的方法,其他方法根据业务需求去重写。

public class MyRecyclerAdapter extends RecyclerView.Adapter {

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}

然后就是去添加list的item样式,再填充适配器内容了。

4.创建item布局文件recycler_item_layout.xml
作为Demo,在item里面就放一个文本TextView控件。这里读者可以任意书写。
创建步骤:

创建item-1
创建item-2

代码:

<?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">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Recycler View"
        android:gravity="center"/>

</LinearLayout>

5.填充适配器内容MyRecyclerAdapter.java

public class MyRecyclerAdapter extends RecyclerView.Adapter {

    private Activity mactivity;


    public MyRecyclerAdapter(Activity activity) {
        this.mactivity = activity;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mactivity).
                inflate(R.layout.recycler_item_layout, viewGroup, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        ((MyViewHolder)viewHolder).tv.setText("我是第"+i+"个item");
    }

    @Override
    public int getItemCount() {
        return 20;
    }

    //创建一个内部类
    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tv;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.text_view);
        }
    }

}

6.修改MainActivity.java

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setAdapter(new MyRecyclerAdapter(MainActivity.this));
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

    }
}

7.修改item布局的高度

<?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="50dp">
<!-- 修改item高度为50dp -->

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Recycler View"
        android:gravity="center"/>

</LinearLayout>

8.运行,查看效果

效果图

完成。(全部代码看第三部分)

二、设置布局管理器LayoutManager

尝试修改LayoutManager
设置布局管理器LayoutManager:
recyclerView.setLayoutManager(LayoutManager layoutManager)

三个布局管理类:

  • LinearLayoutManager:线性布局管理器
  • StaggeredGridLayoutManager: 错列网格布局管理器
  • GridLayoutManager:网格布局管理器

前面使用的是线性布局:

recyclerView.setLayoutManager(new LinearLayoutManager(this));

现在改成网格布局(2是列数,2列):

recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
网格效果图

详述:

  • 线性布局LinearLayoutManage(父类LayoutMananger)
    构造方法:
    //context上下文(实现的是默认的垂直布局)
    LinearLayoutManager(Context context)
    //context上下文,orientation布局显示方式,reverseLayout布尔值是否反转
    LinearLayoutManager( Context context, int orientation, boolean reverseLayout)
    备注:反转的垂直布局->数据从下到上加载,滑动从上往下,加载新数据,新数据在顶部
    orientation:
    LinearLayoutManager.HORIZONTAL
    LinearLayoutManager.VERTICAL

  • 错列布局StaggeredGridLayoutManager(父类LayoutMananger)
    构造方法:
    //spanCount显示的列数,orientation显示的方向
    StaggeredGridLayoutManager(int spanCount,int orientation)

  • 网格布局GridLayoutManager(父类LinearLayoutManager)
    构造方法:
    //context上下文环境,spanCount显示列数(默认显示垂直布局)
    GridLayoutManager(Context context, int spanCount)
    //context上下文环境,spanCount显示列数,orientation方向,reverseLayout是否反转
    GridLayoutManager( Context context, int spanCount, int orientation, boolean reverseLayout)

完成。

三、全部代码如下:

四个文件: MainActivity.java、MyRecyclerAdapter.java、activity_main.xml、recycler_item_layout.xml。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setAdapter(new MyRecyclerAdapter(MainActivity.this));
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));

        //设置Item增加、移除动画
//        recyclerView.setItemAnimator(new DefaultItemAnimator());
//        //添加分割线
//        recyclerView.addItemDecoration(new DividerItemDecoration(
//                getActivity(), DividerItemDecoration.HORIZONTAL_LIST));


    }
}

MyRecyclerAdapter.java

public class MyRecyclerAdapter extends RecyclerView.Adapter {

    private Activity mactivity;


    public MyRecyclerAdapter(Activity activity) {
        this.mactivity = activity;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mactivity).
                inflate(R.layout.recycler_item_layout, viewGroup, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        ((MyViewHolder)viewHolder).tv.setText("我是第"+i+"个item");
    }

    @Override
    public int getItemCount() {
        return 20;
    }

    //创建一个内部类
    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tv;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.text_view);
        }
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">
        ></android.support.v7.widget.RecyclerView>

</android.support.constraint.ConstraintLayout>

recycler_item_layout.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="50dp">


    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Recycler View"
        android:gravity="center"/>

</LinearLayout>

完成。

后续会再补充更多RecyclerView的自定义。

相关文章

网友评论

    本文标题:Android数据列表之RecyclerView的使用

    本文链接:https://www.haomeiwen.com/subject/ssndoftx.html