适配器作用:绑定布局文件的数据(数据是什么?怎么展示?)
没有导入RecyclerView依赖的请参考:https://blog.csdn.net/weixin_42230348/article/details/103020497
适配器实现准备:
1、一个RecyclerView活动+布局(布局一般是以列表的形式将数据展示出了)
2、定义一个实体类Entity:为接下来设置和传递实体数据做准备
3、ListDemoAdapter: 自定义适配器
4、item_list_demo布局: 设定数据每一行怎么展示?
具体实现如下:
1、一个RecyclerView活动+布局(布局一般是以列表的形式将数据展示出了)
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewActivity extends AppCompatActivity {
private RecyclerView recyclerView ;
private ListDemoAadapter adapter ;
private List<Entity> data ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView = findViewById(R.id.cycler_view) ;
//设置布局管理器
recylerView.setLayoutManager(new LinearLayoutManager(this)) ;
//设置适配器
adapter = new ListDemoAdapter(null) ; //获得自定义适配器实例
recyclerView.setAdapter(adapter);
initData();
}
//为实体赋值并将加载到适配器中
private void initData(){
data = new ArrayList<>() ;
for(int i=0; i<100 ; i++){
Entity entity = new Entity("index" + i) ;
data.add(entity) ;
}
adapter.setData(data) ;
}
}
activity_recycler_view布局
<?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=".RecyclerViewActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2、定义一个实体类Entity:为接下来设置和传递实体数据做准备
import android.os.Parcel;
import android.os.Parcelable;
//序列化,目的是为了数据的传输
public class Entity implements Parcelable
{
private int count;
private String msg;
public Entity(int count)
{
this.count = count;
}
public Entity(int count, String msg)
{
this.count = count;
this.msg = msg;
}
public Entity(String msg)
{
this.msg = msg;
}
public int getCount()
{
return count;
}
public void setCount(int count)
{
this.count = count;
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this.msg = msg;
}
@Override
public int describeContents() { return 0; }
@Override
public void writeToParcel(Parcel dest, int flags)
{
dest.writeInt(this.count);
dest.writeString(this.msg);
}
protected Entity(Parcel in)
{
this.count = in.readInt();
this.msg = in.readString();
}
public static final Parcelable.Creator<Entity> CREATOR = new Parcelable.Creator<Entity>()
{
@Override
public Entity createFromParcel(Parcel source) {return new Entity(source);}
@Override
public Entity[] newArray(int size) {return new Entity[size];}
};
}
3、ListDemoAdapter: 自定义适配器
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
//自定义适配器
public class ListDemoAdapter extends RecyclerView.Adapter<ListDemoAdapter.ListViewHolder> {
private List<Entity> data;
public ListDemoAdapter(List<Entity> data)
{
this.data = data;
}
public void setData(List<Entity> data)
{
this.data = data;
// 刷新数据
notifyDataSetChanged();
}
/**
*创建一个viewHolder并返回
* @param parent 相当于Item存放的容器
* @param viewType 指定布局文件的类型
* @return 返回viewHolder对象
*/
@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定对应的布局文件
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_demo,parent,false);
return new ListViewHolder(view);
}
/**
* 将数据加载到布局文件的控件上
* @param holder 需要绑定数据的viewHolder
* @param position 列表数据的下标
*/
@Override
public void onBindViewHolder(@NonNull ListDemoAdapter.ListViewHolder holder, int position) {
Entity entity = data.get(position);
holder.textView.setText(entity.getMsg());
}
/**
*返回数据的大小
* @return
*/
@Override
public int getItemCount() {
return data == null ? 0 : data.size();
}
//为了系统复用控件
static class ListViewHolder extends RecyclerView.ViewHolder
{
TextView textView;
public ListViewHolder(@NonNull View itemView)
{
super(itemView);
// 实例化该控件
textView = itemView.findViewById(R.id.tv_text);
}
}
}
4、item_list_demo布局: 设定数据每一行怎么展示?
<?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"
android:orientation="vertical">
<TextView
android:id="@+id/tv_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="30dp"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="TextView"
tools:textColor="@color/colorPrimary"
tools:textSize="30sp" />
<View
android:id="@+id/textView7"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginBottom="4dp"
android:background="#4E0B0B"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_text" />
</androidx.constraintlayout.widget.ConstraintLayout>
ok,大功告成!!!