Java 如何通过改造在RecyclerView中实现分页?
我有api调用请求和参数:(page,pageSize:所需的最大项数(默认值25,最大值100。来自reddit api文档)),我想在RecyclerView中使用分页。我的数据加载成功,但问题是如何向服务器请求下一页。如何使用方法addOnScrollListener执行分页 Web服务类Java 如何通过改造在RecyclerView中实现分页?,java,android,json,android-recyclerview,Java,Android,Json,Android Recyclerview,我有api调用请求和参数:(page,pageSize:所需的最大项数(默认值25,最大值100。来自reddit api文档)),我想在RecyclerView中使用分页。我的数据加载成功,但问题是如何向服务器请求下一页。如何使用方法addOnScrollListener执行分页 Web服务类 公共接口RedditWebService{ @GET(“top.json”) 可观察的gettoPublication(@Query(“count”)int count, @查询(“限制”)int pa
公共接口RedditWebService{
@GET(“top.json”)
可观察的gettoPublication(@Query(“count”)int count,
@查询(“限制”)int pageSize);
}
适配器类
公共类RedditAdapter扩展了RecyclerView.Adapter{
私人名单儿童名单;
私人语境;
公共RedditAdapter(上下文,列表子列表){
this.childList=childList;
this.context=上下文;
}
@非空
@凌驾
public RedditViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.items\u布局,parent,false);
返回新的RedditViewHolder(视图);
}
@SuppressLint(“DefaultLocale”)
@凌驾
public void onBindViewHolder(@NonNull RedditViewHolder,int位置){
final Child=childList.get(位置);
holder.txtAuthor.setText(child.getmData().getmautor());
字符串timeAgo=timeAgo.getTimeAgo(child.getmData().getmCreated());
Log.d(“时间”,即“+timeAgo”);
holder.txtDate.setText(timeAgo);
holder.txtcoment.setText(String.format(“注释:%d”,child.getmData().getmNumComments());
Picasso.get().load(child.getmData().getmThumbnail()).placeholder(R.drawable.placeholder)。
将(ImageTransformation.getTransformation(holder.imageView))转换为(holder.imageView);
如果(!child.getmData().getmThumbnail()等于(“”){
holder.imageView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Intent Intent=新的Intent(context.getApplicationContext(),SecondActivity.class);
intent.putExtra(“extraImage”,child.getmData().getmThumbnail());
背景。开始触觉(意图);
}
});
}
}
@凌驾
public int getItemCount(){
返回值(childList==null)?0:childList.size();
}
公共类RedditViewHolder扩展了RecyclerView.ViewHolder{
私人影像视图;
私有文本视图txtDate、txtAuthor、txtComment;
公共RedditViewHolder(@NonNull View itemView){
超级(项目视图);
imageView=itemView.findViewById(R.id.image\u视图);
txtDate=itemView.findviewbyd(R.id.txt\u日期);
txtAuthor=itemView.findviewbyd(R.id.txt\u author);
txtcoment=itemView.findviewbyd(R.id.txt\u comments\u num);
}
}
}
主要活动
public类MainActivity扩展了AppCompatActivity{
私人回收站;
私人专线经理;布局经理;
私人ProgressBar ProgressBar;
专用RedditAdapter适配器;
private List redditList=new ArrayList();
private CompositeDisposable disposable=新CompositeDisposable();
私有int页=0;
私有int pageSize=50;
@注入
RedditWebService-webService;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
((BaseApplication)getApplication()).getComponent().inject(this);
setContentView(R.layout.activity_main);
progressBar=findViewById(R.id.progressBar);
recyclerView=findViewById(R.id.recycler\u视图);
layoutManager=新的LinearLayoutManager(此);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
fetchData();
}
私有void fetchData(){
progressBar.setVisibility(View.VISIBLE);
一次性.add(webService.getTopPublication)(页面,页面大小)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新消费者){
@凌驾
公共void接受(响应)引发异常{
适配器=新的RedditAdapter(MainActivity.this,response.getData().getChildren());
recyclerView.setAdapter(适配器);
progressBar.setVisibility(View.GONE);
}
},新消费者(){
@凌驾
public void accept(Throwable Throwable)引发异常{
Toast.makeText(MainActivity.this,throwable.toString(),Toast.LENGTH_LONG.show();
}
}));
}
提前感谢使用endlessRecycleWebScrollListener.java,它将提供非常简单的方法来执行加载更多调用
EndlessRecyclerViewScrollListener scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to the bottom of the list
page++;
loadMoreCall(page);
}
};
将一个全局变量“page”保持为1,并在每次API调用或加载更多调用时将其增加1
EndlessRecyclerViewScrollListener scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to the bottom of the list
page++;
loadMoreCall(page);
}
};
在loadMoreCall()中,您需要添加api调用,在成功的api调用之后,您需要将数据设置到列表中,然后需要通知适配器。仅此而已
参考:
以下是如何使用改型调用api:
使用EndlessRecyclerViewScrollListener.java,它将提供非常简单的方法来执行加载更多调用
EndlessRecyclerViewScrollListener scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to the bottom of the list
page++;
loadMoreCall(page);
}
};
将一个全局变量“page”保持为1,并在每次API调用或加载更多调用时将其增加1
EndlessRecyclerViewScrollListener scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to the bottom of the list
page++;
loadMoreCall(page);
}
};
在loadMoreCall()中,您需要添加api调用,在成功的api调用之后,您需要将数据设置到列表中,然后需要通知适配器。仅此而已
参考:
下面介绍如何使用ret调用api