1. 程式人生 > >【Android】從無到有:手把手一步步教你構建並使用RecyclerView

【Android】從無到有:手把手一步步教你構建並使用RecyclerView

轉載請註明出處,原文連結: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

本人尚屬初學者,如有錯誤或疑問請評論提出,由衷感謝!