转载请注明出处,原文链接: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
本人尚属初学者,如有错误或疑问请评论提出,由衷感谢!