JetPack中的Paging库,实现分页按需加载数据。(学习笔记)

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

mainlayout布局
JetPack中的Paging库,实现分页按需加载数据。(学习笔记)_第1张图片

为recycleview添加单元格 新建一个celllayout 父容器选择warp layout就行了 具体样式看自己布局
JetPack中的Paging库,实现分页按需加载数据。(学习笔记)_第2张图片

然后新建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;
    }
}
}

然后就可以运行了
JetPack中的Paging库,实现分页按需加载数据。(学习笔记)_第3张图片

JetPack中的Paging库,实现分页按需加载数据。(学习笔记)_第4张图片

你可能感兴趣的:(Android学习)