【问题标题】:How to implement Pagination in RecyclerView with retrofit?如何通过改造在 RecyclerView 中实现分页?
【发布时间】:2020-01-23 12:05:43
【问题描述】:

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

方法执行分页

网络服务类

public interface RedditWebService {

    @GET("top.json")
   Observable<Response> getTopPublication(@Query("count")int count, 
                                          @Query("limit")int pageSize);
}

适配器类

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);
        }
    }
}

主活动

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();

                    }
                }));
    }

提前致谢

【问题讨论】:

标签: java android json android-recyclerview


【解决方案1】:

使用 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 调用后,你需要将数据设置到你的列表中,然后你需要通知你的 adaper。仅此而已。

参考:https://guides.codepath.com/android/endless-scrolling-with-adapterviews-and-recyclerview

这里如何调用,api使用改造: https://demonuts.com/android-recyclerview-retrofit/

【讨论】:

  • 感谢您的帮助,但在本教程中没有清晰的代码,大多数方法都是空的
  • 你能写出整个方法吗?
  • 对不起,您可以按照demonuts.com/android-recyclerview-retrofit教程。
  • 我知道如何使用 recyclerview 获取数据,但我想要完整的分页方法
  • @MohammedQadah 先生有什么成功的吗?
【解决方案2】:

考虑使用新的分页库。这是sampledocumentation。它表现得更好,您不必手动跟踪您在滚动中的位置。通过遵循示例,我发现实现它相当容易,尽管它有很多样板代码。

【讨论】:

  • 这个示例太难了,我不想用很多库,但无论如何谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2019-03-06
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多