Как реализовать разбиение на страницы в RecyclerView с модернизацией? - PullRequest
0 голосов
/ 23 января 2020

У меня запрос вызова API с параметрами: (page, pageSize: максимальное количество требуемых элементов (по умолчанию 25, максимум 100. Из документации Reddit API)), и я хочу использовать нумерацию страниц в RecyclerView . Мои данные загружаются успешно, но проблема в том, как запросить у сервера следующую страницу. Как я могу выполнить разбиение на страницы с помощью метода addOnScrollListener

WebService Класс

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

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

                    }
                }));
    }

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Рассмотрите возможность использования новой библиотеки подкачки. Вот образец и документация . Он работает лучше, и вам не нужно вручную отслеживать, где вы находитесь в прокрутке. Следуя примеру, я нашел, что это довольно легко реализовать, хотя это много стандартного кода.

0 голосов
/ 23 января 2020

Используйте EndlessRecyclerViewScrollListener. java, это обеспечит очень простой способ загружать больше вызовов.

Поддерживать инициализацию одной глобальной переменной "страница" на 1 и увеличивать ее на 1 при каждом вызове или загрузке API more call.

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 с помощью модернизации: https://demonuts.com/android-recyclerview-retrofit/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...