我有带有参数的api调用请求:(页面,pageSize:所需的最大项目数(默认25,最大100。来自reddit api文档)),并且我想在中使用分页RecyclerView。我的数据已成功加载,但问题是如何向服务器请求下一页。如何使用方法 addOnScrollListener
执行分页WebService Class
public interface RedditWebService {
@GET("top.json")
Observable<Response> getTopPublication(@Query("count")int count,
@Query("limit")int pageSize);
}
Adapter Class
public class RedditAdapter extends RecyclerView.Adapter<RedditAdapter.RedditViewHolder> {
private List<Child> childList;
private Context context;
public RedditAdapter(Context context, List<Response.Data.Child> childList) {
this.childList = childList;
this.context = context;
}
@NonNull
@Override
public RedditViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_layout, parent, false);
return new RedditViewHolder(view);
}
@SuppressLint("DefaultLocale")
@Override
public void onBindViewHolder(@NonNull RedditViewHolder holder, int position) {
final Child child = childList.get(position);
holder.txtAuthor.setText(child.getmData().getmAuthor());
String timeAgo = TimeAgo.getTimeAgo(child.getmData().getmCreated());
Log.d("Time", "" + timeAgo);
holder.txtDate.setText(timeAgo);
holder.txtComment.setText(String.format("Comments: %d", child.getmData().getmNumComments()));
Picasso.get().load(child.getmData().getmThumbnail()).placeholder(R.drawable.placeholder).
transform(ImageTransformation.getTransformation(holder.imageView)).into(holder.imageView);
if (!child.getmData().getmThumbnail().equals("")) {
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context.getApplicationContext(), SecondActivity.class);
intent.putExtra("extraImage", child.getmData().getmThumbnail());
context.startActivity(intent);
}
});
}
}
@Override
public int getItemCount() {
return (childList == null) ? 0 : childList.size();
}
public class RedditViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView txtDate, txtAuthor, txtComment;
public RedditViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.image_view);
txtDate = itemView.findViewById(R.id.txt_date);
txtAuthor = itemView.findViewById(R.id.txt_author);
txtComment = itemView.findViewById(R.id.txt_comments_num);
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private ProgressBar progressBar;
private RedditAdapter adapter;
private List<Child> redditList = new ArrayList<>();
private CompositeDisposable disposable = new CompositeDisposable();
private int page = 0;
private int pageSize = 50;
@Inject
RedditWebService webService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseApplication) getApplication()).getComponent().inject(this);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.progress_bar);
recyclerView = findViewById(R.id.recycler_view);
layoutManager = new LinearLayoutManager(this);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
fetchData();
}
private void fetchData() {
progressBar.setVisibility(View.VISIBLE);
disposable.add(webService.getTopPublication(page,pageSize)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response>() {
@Override
public void accept(Response response) throws Exception {
adapter = new RedditAdapter(MainActivity.this, response.getData().getChildren());
recyclerView.setAdapter(adapter);
progressBar.setVisibility(View.GONE);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(MainActivity.this, throwable.toString(), Toast.LENGTH_LONG).show();
}
}));
}
提前致谢
最佳答案
使用EndlessRecyclerViewScrollListener.java,它将提供非常简单的方法来加载更多调用。
维护一个全局变量“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 调用后,您需要将数据设置到您的列表中,然后您需要通知您的适配器。仅此而已。
引用:https://guides.codepath.com/android/endless-scrolling-with-adapterviews-and-recyclerview
这里如何调用,api使用retrofit: https://demonuts.com/android-recyclerview-retrofit/
关于java - 如何通过改造在RecyclerView中实现分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59878168/