【Android】从无到有:手把手一步步教你构建并使用RecyclerView

版权声明:本文为博主原创文章,商业转载请联系博主获得授权,非商业转载请注明出处,否则追究其法律责任。 https://blog.csdn.net/u013642500/article/details/80480906

转载请注明出处,原文链接:https://blog.csdn.net/u013642500/article/details/80480906

【AS版本】


【添加依赖】

1、打开 Project Structural。(可点击图标 ,也可以在File菜单中打开,也可以按 Ctrl+Alt+Shift+S)

2、点击你的项目“app”,然后点击“Dependencies”,点击右侧的绿色的加号“Add”,然后点击第一个“Library dependency”。


3、搜索框内输入“recyclerview-v7”,然后按回车。选择第一项,点击OK。


4、看到添加好的“com.android.support:recyclerview-v7:27.1.1”,点击OK。


【创建item布局】

1、新建一个 item_recyclerview.xml 布局文件。


2、布局文件中写两个 TextView,分别给 id 为 txtItemName 和 txtItemAge。

<?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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtItemName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/txtItemAge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#000" />
</LinearLayout>

【构建RecyclerView适配器】

注:可直接在 MainActivity 中构建,但为避免造成 MainActivity 中代码杂乱无章,本文采用新建类继承 RecyclerView 的方法构建。

1、新建一个 MyRecyclerView 类。

package com.test.myapplication;

public class MyRecyclerView {

}

2、写一个 MyRecyclerView 类构造方法,参数为 Context context 和 List<List<String>> mList(可以将 List<List<String>> 类型改成 ArrayList<ArrayList<String>> 或数组等,此处为传递的数据,本文采用的是 List<List<String>> 类型)。

package com.test.myapplication;

import android.content.Context;

import java.util.List;

public class MyRecyclerView {

    public MyRecyclerView(Context context, List<List<String>> mList){

    }
}

3、定义两个全局变量。

    private List<List<String>> mList;
    private LayoutInflater inflater;
4、在 MyRecyclerView 类构造方法中,给这两个全局变量初始化。
package com.test.myapplication;

import android.content.Context;
import android.view.LayoutInflater;

import java.util.List;

public class MyRecyclerView {

    public MyRecyclerView(Context context, List<List<String>> mList){
        this.mList = mList;
        this.inflater = LayoutInflater.from(context);
    }
}

5、在 MyRecyclerView 类中构建一个内部类 MyViewHolder,继承自 RecyclerView.ViewHolder。

package com.test.myapplication;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;

import java.util.List;

public class MyRecyclerView {
    private List<List<String>> mList;
    private LayoutInflater inflater;

    class MyViewHolder extends RecyclerView.ViewHolder{

    }

    public MyRecyclerView(Context context, List<List<String>> mList){
        this.mList = mList;
        this.inflater = LayoutInflater.from(context);
    }
}

6、此时内部类会报错,原因是 RecyclerView.ViewHolder 没有无参构造函数,所以必须显式调用父类构造方法,并且传递对应所需要的参数。 可以将光标放在报错行,然后按 Alt+Enter,选择 Create constructor matching super;或者手动敲上构造方法。


package com.test.myapplication;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;

import java.util.List;

public class MyRecyclerView {
    private List<List<String>> mList;
    private LayoutInflater inflater;

    class MyViewHolder extends RecyclerView.ViewHolder{

        MyViewHolder(View itemView) {
            super(itemView);
        }
    }

    public MyRecyclerView(Context context, List<List<String>> mList){
        this.mList = mList;
        this.inflater = LayoutInflater.from(context);
    }
}

4、让我们刚才新建的 MyRecyclerView 类,继承自 RecyclerView.Adapter<MyRecyclerView.MyViewHolder>,其中尖角号<>中填入我们刚刚构建的内部类 MyRecyclerView.MyViewHolder。

package com.test.myapplication;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;

import java.util.List;

public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerView.MyViewHolder>{
    private List<List<String>> mList;
    private LayoutInflater inflater;

    class MyViewHolder extends RecyclerView.ViewHolder{

        MyViewHolder(View itemView) {
            super(itemView);
        }
    }

    public MyRecyclerView(Context context, List<List<String>> mList){
        this.mList = mList;
        this.inflater = LayoutInflater.from(context);
    }
}

5、此时 MyRecyclerView 类会报错,原因是没有重写父类的三个抽象方法 onCreateViewHolder、onBindViewHolder、getItemCount。我们可以选择将光标放在报错行,然后按 Alt+Enter,选择 Implement methods,然后选择三个方法,让系统构建;或者手动敲上三个抽象方法。


6、本文选择手动敲入,重写 onCreateViewHolder

(1)敲入 oCVH,按回车。


(2)在 onCreateViewHolder 方法中,实例化一个View对象,然后返回一个新的 MyViewHolder 对象,参数为刚刚实例化的 View 对象。

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_recyclerview,parent,false);
        return new MyViewHolder(view);
    }

7、在 MyViewHolder 内部类的构造方法中,获取布局控件 txtItemName 和 txtItemAge。

    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView txtItemName;
        private TextView txtItemAge;

        MyViewHolder(View itemView) {
            super(itemView);

            txtItemName = itemView.findViewById(R.id.txtItemName);
            txtItemAge = itemView.findViewById(R.id.txtItemAge);
        }
    }

8、重写 onBindViewHolder

(1)敲入 oBVH,按回车。


(2)在 onBindViewHolder 方法中,对布局控件进行修改。

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.txtItemName.setText(mList.get(position).get(0));
        holder.txtItemAge.setText(mList.get(position).get(1));
    }

9、重写 getItemCount

(1)敲入 gIC,按回车。


(2)在 getItemCount 方法中,直接返回 mList 的长度。

    @Override
    public int getItemCount() {
        return mList.size();
    }

【MainAtivity布局添加RecyclerView】

打开 MainActivity 的布局 activity_main.xml,添加 RecyclerView 控件,并给 id 为 recyclerView。

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

【绑定RecyclerView适配器】

1、打开 MainActivity,即要将 RecyclerView 绑定的 Activity。

2、先实例化两个对象。

        List<List<String>> mList = new ArrayList<>();
        List<String> tempList;

3、创造数据。

        tempList = new ArrayList<>();
        tempList.add("王一");
        tempList.add("18");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("赵二");
        tempList.add("19");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("李三");
        tempList.add("16");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("孙四");
        tempList.add("20");
        mList.add(tempList);

4、绑定适配器:

        // 初始化 RecyclerView
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        // 实例化LinearLayoutManager对象
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        // 设置 RecyclerView 布局为线性布局
        recyclerView.setLayoutManager(linearLayoutManager);
        // 实例化 Adapter
        MyRecyclerView adapter = new MyRecyclerView(this, mList);
        // 设置 Adapter
        recyclerView.setAdapter(adapter);

【成果】


【源代码】

布局文件item_recyclerview.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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtItemName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/txtItemAge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#000" />
</LinearLayout>

布局文件activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>

Java文件MyRecyclerView.java:

package com.test.myapplication;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerView.MyViewHolder> {
    private List<List<String>> mList;
    private LayoutInflater inflater;

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_recyclerview, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.txtItemName.setText(mList.get(position).get(0));
        holder.txtItemAge.setText(mList.get(position).get(1));
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView txtItemName;
        private TextView txtItemAge;

        MyViewHolder(View itemView) {
            super(itemView);

            txtItemName = itemView.findViewById(R.id.txtItemName);
            txtItemAge = itemView.findViewById(R.id.txtItemAge);
        }
    }

    MyRecyclerView(Context context, List<List<String>> mList) {
        this.mList = mList;
        this.inflater = LayoutInflater.from(context);
    }
}

Java文件MainActivity.java:

package com.test.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

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

        List<List<String>> mList = new ArrayList<>();
        List<String> tempList;

        tempList = new ArrayList<>();
        tempList.add("王一");
        tempList.add("18");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("赵二");
        tempList.add("19");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("李三");
        tempList.add("16");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("孙四");
        tempList.add("20");
        mList.add(tempList);

        // 初始化 RecyclerView
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        // 实例化LinearLayoutManager对象
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        // 设置 RecyclerView 布局为线性布局
        recyclerView.setLayoutManager(linearLayoutManager);
        // 实例化 Adapter
        MyRecyclerView adapter = new MyRecyclerView(this, mList);
        // 设置 Adapter
        recyclerView.setAdapter(adapter);
    }
}

【相关链接】

添加item的手势监听,请参考:https://blog.csdn.net/u013642500/article/details/80488425

本人尚属初学者,如有错误或疑问请评论提出,由衷感谢!

猜你喜欢

转载自blog.csdn.net/u013642500/article/details/80480906