B站的一个UP主 https://www.bilibili.com/video/av74206706
使用Paging库就需要用到数据库 (在gradle中添加依赖)
最新依赖见 https://developer.android.google.cn/jetpack/androidx/releases/room
page依赖
def paging_version = "2.1.1"
implementation "androidx.paging:paging-runtime:$paging_version" // For Kotlin use paging-runtime-ktx
room依赖
def room_version = "2.2.3"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
为recycleview添加单元格 新建一个celllayout 父容器选择warp layout就行了 具体样式看自己布局
然后新建Student类
@Entity(tableName = "student_table") //声明表明 如果不写的话 好像默认时clas名
public class Student {
@PrimaryKey (autoGenerate = true) //设置id为主键 autoGenerate是否自动生成
private int id;
@ColumnInfo (name = "student_number") //声明列明 不写则是studentNumber
private int studentNumber;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(int studentNumber) {
this.studentNumber = studentNumber;
}
}
StudentDao
@Dao
public interface StudentDao {
@Insert
void insetStudent (Student ...students);//Student ...students是可以传入多个student
@Query("DELETE FROM student_table")
void deleteAllStudent();
@Query("SELECT * FROM student_table ORDER BY id")
DataSource.Factory queryAll();
}
StudentDatabase
@Database(entities = {Student.class},version = 1,exportSchema = false) //entities{}括号里可以写多个 数据类, version是当前版本,exportSchema好像是否导入本地文件
public abstract class StudentDatabase extends RoomDatabase {
private static StudentDatabase instance;//实例
static synchronized StudentDatabase getInstance(Context context){
if (instance==null){//如果不存在 就新建一个
instance = Room.databaseBuilder(context,StudentDatabase.class,"students_database").build();
}
return instance;
}
abstract StudentDao getStudentDao(); //得到StudentDao
}
数据库操作是好了 然后就是如何把cell应用到 recyleview中去了 我们使用PagedListAdapter
然后新建MyPageAdpter
public class MyPageAdpter extends PagedListAdapter {
protected MyPageAdpter() {
super(new DiffUtil.ItemCallback() {//是否是同一个判断
@Override
public boolean areItemsTheSame(@NonNull Student oldItem, @NonNull Student newItem) {
return oldItem.getId() == newItem.getId();//判断id是否相同
}
@Override
public boolean areContentsTheSame(@NonNull Student oldItem, @NonNull Student newItem) {
return oldItem.getStudentNumber() == newItem.getStudentNumber(); //id相同则判断内容是否相同
}
});
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//当创建时启动
LayoutInflater inflater = LayoutInflater.from(parent.getContext());// LayoutInflater的作用是,把一个View的对象与XML布局文件关联并实例化
View view = inflater.inflate(R.layout.cell,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
Student student = getItem(position);//position时每个recyclerview item 的位置
if (student == null){//还没加载到 或者空的时候显示loading
holder.textView.setText("loading");
}else {
holder.textView.setText(String.valueOf(student.getStudentNumber()));//将获取到的显示到textview
}
}
static class MyViewHolder extends RecyclerView.ViewHolder{//将textview绑定 获取
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
在MainActivity写入如下代码就行(我部分写了注释 实在看不懂百度)
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
Button buttonPopulate,buttonClear;
MyPageAdpter pageAdpter;
StudentDatabase studentDatabase;
StudentDao studentDao;
LiveData> allStudentLivePage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView =findViewById(R.id.recyclerView);
buttonClear =findViewById(R.id.buttonClear);
buttonPopulate = findViewById(R.id.buttonPoplulate);
pageAdpter = new MyPageAdpter();
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));//添加每个item中间的分隔符
recyclerView.setAdapter(pageAdpter);
studentDatabase =StudentDatabase.getInstance(this);
studentDao = studentDatabase.getStudentDao();
allStudentLivePage = new LivePagedListBuilder<>(studentDao.queryAll(),10).build(); //pagesize是加载的数量
allStudentLivePage.observe(this, new Observer>() {//LiveData添加观察事件 当数据发生改变时候提交
@Override
public void onChanged(PagedList students) {
pageAdpter.submitList(students);
students.addWeakCallback(null, new PagedList.Callback() {//添加回调
@Override
public void onChanged(int position, int count) {//当数据变化时执行
String str = "数据不够进行加载";
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG);
}
@Override
public void onInserted(int position, int count) {
}
@Override
public void onRemoved(int position, int count) {
}
});
}
});
buttonPopulate.setOnClickListener(new View.OnClickListener() {//插入数据
@Override
public void onClick(View v) {
Student[] students = new Student[1000];
for (int i = 0 ;i < 1000; i++){
Student student = new Student();
student.setStudentNumber(i);
students[i] = student;
}
new InsertAsyncTask(studentDao).execute(students);
}
});
buttonClear.setOnClickListener(new View.OnClickListener() {//清空数据
@Override
public void onClick(View v) {
new DeleteAsyncTask(studentDao).execute();
}
});
}
static class InsertAsyncTask extends AsyncTask{//异步插入类
StudentDao studentDao;
public InsertAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student... students) {
studentDao.insetStudent(students);
return null;
}
}
static class DeleteAsyncTask extends AsyncTask{//异步删除
StudentDao studentDao;
public DeleteAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student... students) {
studentDao.deleteAllStudent();
return null;
}
}
}