Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过改造在RecyclerView中实现分页?_Java_Android_Json_Android Recyclerview - Fatal编程技术网

Java 如何通过改造在RecyclerView中实现分页?

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

我有api调用请求和参数:(page,pageSize:所需的最大项数(默认值25,最大值100。来自reddit api文档)),我想在RecyclerView中使用分页。我的数据加载成功,但问题是如何向服务器请求下一页。如何使用方法addOnScrollListener执行分页

Web服务类

公共接口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