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布局
在这里插入图片描述

为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<Integer,Student> 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 <Student,MyPageAdpter.MyViewHolder>{

protected MyPageAdpter() {
    super(new DiffUtil.ItemCallback<Student>() {//是否是同一个判断
        @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<PagedList<Student>> 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<PagedList<Student>>() {//LiveData添加观察事件 当数据发生改变时候提交
        @Override
        public void onChanged(PagedList<Student> 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<Student,Void,Void>{//异步插入类
    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<Student,Void,Void>{//异步删除
    StudentDao studentDao;

    public DeleteAsyncTask(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    protected Void doInBackground(Student... students) {
        studentDao.deleteAllStudent();
        return null;
    }
}
}

然后就可以运行了
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android Jetpack Compose ,可以使用 Modifier 的 combinedClickable 和 draggable 属性来实现同时监听点击和拖动的功能。具体实现步骤如下: 1. 导入 Compose 的 Modifier 和 rememberDraggableState。 ```kotlin import androidx.compose.foundation.gestures.draggable import androidx.compose.foundation.gestures.rememberDraggableState import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.toSize ``` 2. 在要添点击和拖动的组件上,使用 Modifier 的 combinedClickable 和 draggable 属性,同时设置 interactionSource 和 draggableState。 ```kotlin // 设置 interactionSource val interactionSource = remember { MutableInteractionSource() } // 设置 draggableState val draggableState = rememberDraggableState { delta -> // 处理拖动过程的回调 } // 添 combinedClickable 和 draggable 属性 Box( modifier = Modifier .combinedClickable( interactionSource = interactionSource, indication = null, onClick = { // 处理点击事件的回调 } ) .draggable( state = draggableState, orientation = Orientation.Horizontal, onDragStopped = { velocity -> // 处理拖动结束的回调 }, interactionSource = interactionSource, ) ) { // 添要点击和拖动的组件 } ``` 这样就可以同时实现监听点击和拖动的功能了。要注意的是,点击和拖动的回调分别在 combinedClickable 和 draggable 属性处理。同时,我们也可以通过 draggableState 的回调来处理拖动过程的事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值