【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
本人尚屬初學者,如有錯誤或疑問請評論提出,由衷感謝!