RecyclerView的基本使用
关于如何使用RecyclerView加载数据的个人见解(可能有些抽象,搞懂之后我会尽量改善)
主要有5个步骤(我分的):
- 在布局中添加一个RecyclerView的容器;
- 创建一个layout作为RecyclerView中每条项目的布局;
- 创建适配器,继承自RecyclerView.Adapter,这个非常重要,这个适配器完成的工作是加载需要呈现在界面上的数据以及为每条项目加载布局。需要重写3个方法;
- 创建ViewHolder的子类来管理每条项目;
- 在activity或者fragment中将RecyclerView和Adapter绑定。
不多说,直接上代码
添加RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".MainActivity2">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="409dp"
android:layout_height="729dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
创建每条项目的layout
```java
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/sex"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/name"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
创建适配器和ViewHolder
```java
package com.example.viewpage.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.viewpage.R;
import com.example.viewpage.entity.User;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
/**
* author: WangJunYan
* package: com.example.viewpage.adapter
* date: 2020/6/3
* time: 20:15
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
//需要加载的数据,在项目中应该是从数据库中加载的,此处仅仅作为例子说明
List<User> userList = new ArrayList<>();
//初始化数据
public MyAdapter() {
for (int i = 0;i < 40;i++) {
User user = new User("name","sex");
userList.add(user);
}
}
@NonNull
@Override
//第一个需要重写的方法,用于加载每条项目的布局
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.recycler_item_layout,parent,false);
return new MyViewHolder(view);
}
//第二个需要重写的方法,用于加载显示的数据
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
User user = userList.get(position);
holder.name.setText(user.name);
holder.sex.setText(user.sex);
}
//第三个需要重写的方法,用于返回项目数
@Override
public int getItemCount() {
return userList.size();
}
//用于管理每条项目,方便将数据加载出来
static class MyViewHolder extends RecyclerView.ViewHolder{
TextView name,sex;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
sex = itemView.findViewById(R.id.sex);
}
}
}
在activity或者fragment中绑定
package com.example.viewpage;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.viewpage.adapter.MyAdapter;
public class MainActivity2 extends AppCompatActivity {
RecyclerView recyclerView;
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
recyclerView = findViewById(R.id.recycler);
adapter = new MyAdapter();
//为RecyclerView指明其中的条目的布局方式,此处为线性布局
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//绑定适配器
recyclerView.setAdapter(adapter);
}
}