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

标签 java android json android-recyclerview

我有带有参数的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/

相关文章:

java - 在 Eclipse 中将项目构建为可执行 jar 文件时,缓冲图像不呈现

java - 如何在 Java 中解析多维 JSON 字符串

json - 从每首歌中获取 HTTP MP3 流

android - 在gridview中设置图片大小

json - 为什么我的订单数据没有保存在我的 json 文件中

java - 如何迭代对象的 ArrayList 并在迭代时访问该对象所属类的方法?

java - 如何在一个网格框中添加两个标签?

java - Play Framework 在 HTTP 请求中发送文件

java - Java 的 String.getBytes ("ISO-8859-1") 是否返回字符串中每个 2 字节字符的第一个字节?

android - 如何设置闹钟每月重复