【问题标题】:How to implement pagination with recyclerview via api url indexing如何通过 api url indexing 使用 recyclerview 实现分页
【发布时间】:2017-11-22 07:50:32
【问题描述】:

我知道标题看起来很奇怪,但基本上我想要的是将分页应用到我的列表并使用 url api 端点作为参数来控制它。!

例如,端点看起来像这样 > www.someapi.com/josn/list?pageIndex=1

它会给出一个包含 10 个项目的数组的响应,如果我想要更多,我必须将参数的索引更改为 2 等等。!

回复

{
    "Succeeded": true,
    "AvailableChallenge": true,
    "DebugError": "",
    "NextPage": 2,
    "AllPages": 2,
    "Challenges": [
        {
            "ID": 114,
            "Title": "Amet sit id ratione dolorem numquam"
        },
        {
            "ID": 114,
            "Title": "Amet sit id ratione dolorem numquam"
        }
        ...
        ..
        .
        ]
 }

我绑定了所有内容,但无法正确完成,我尝试了 here 中的大多数解决方案,但没有运气。 我也尝试过使用这两个库 Paginaterecyclerview-paginated 甚至这个 SuperRecyclerView。但它没有用。!

任何有关控制这一点的最佳逻辑的帮助都会有很大帮助。


SuperRecyclerView的代码

public class ChallengesListFragment extends BaseFragment {

  private int pageNumber = 1; 
  private SuperRecyclerView recyclerview;
  private ArrayList<ChallengeActive> data;
  private ChallengesAdapter adapter;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_challenges_list, container, false);
    initView(rootView);
    initRecycler();
    getData(1);
    return rootView;
  }

 private void initRecycler() {
    data = new ArrayList<>();

    final RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
    recyclerview.setLayoutManager(mLayoutManager);
    adapter = new ChallengesAdapter(data, getActivity(), this); 
    recyclerview.setAdapter(adapter);

    recyclerview.setupMoreListener(new OnMoreListener() {
      @Override
      public void onMoreAsked(int overallItemsCount, int itemsBeforeMore, int maxLastVisiblePosition) {

        pageNumber++;
        getData(maxLastVisiblePosition);
      }
    }, 10);

    recyclerview.setRefreshListener(new OnRefreshListener() {
      @Override
      public void onRefresh() {
        pageNumber = 1;
        getData(pageNumber);
      }
    });

  }

  private void getData(final int pageNumber) {

      WebRequests.GetActiveChallenges(pageNumber, new onResult() {
      @Override
      public void onSuccess(Object object) {
        ArrayList<ChallengeActive> list = (ArrayList<ChallengeActive>) object;
        data.clear();
        data.addAll(list);
        adapter.notifyDataSetChanged();  
      }

      @Override
      public void onFail(Object object) {
        Toast.makeText(getActivity(), "Something went wrong, try again later",
            Toast.LENGTH_SHORT).show(); 
      }
    }); 
  } 
}  

【问题讨论】:

  • 添加您的代码..
  • 我尝试了很多方法...我会发布一些。
  • 问题:来自服务器的下一个分页答案的数据列表,您想将它添加到现有的列表中还是替换它?
  • 您能否添加一个 API 响应示例?您是否对该 API 拥有任何所有权,以便在需要时更改响应模型?
  • @IonutJ.Bejan 好吧,我认为添加它更好的用户体验。因为无论如何所有项目都不会太大。

标签: java android rest android-recyclerview pagination


【解决方案1】:

这是我在项目中的做法...在这种情况下,当到达列表底部时,我会添加更多元素

rv_flohtainer_events.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (!rv_flohtainer_events.canScrollVertically(1)){
                if (!(eventsResponse.getCurrent_page() == eventsResponse.getLast_page())) {
                    pageEventsRequest++;
                    makeVendorEventsRequest();
                }
            }
        }
    });

我的要求是改造,看起来像这样

@GET(RestClient.API_EVENTS_URL)
Call<EventsResponse> getEvents(@Query("page") int page)

【讨论】:

  • 我有一个问题:你为什么打电话给getData(maxLastVisiblePosition);?我想maxLastVisiblePosition 是 10 或其他东西......另外,onSuccess() 方法你做data.clear(); data.addAll(list); 当然你将只有 10 个元素(但它们正在改变?)
  • 我认为它负责页数。!但是您对@987654327 的看法是对的@如果我想将接下来的 10 个项目添加到原始项目中,我不应该清除数据。但是在使用Paginate Library 进行大量搜索后,我解决了我的问题。我稍后会在一个新答案中发布解决方案,所以无论如何都要感谢男士的帮助。
【解决方案2】:

一段时间后,我使用 Paginate Library


守则

public class ChallengesListFragment extends BaseFragment implements OnRefreshListener, Paginate.Callbacks { 

// other variables..
  private int currentPage = 1;
  private boolean hasMore;
  private boolean loadingInProgress;


  @RequiresApi(api = VERSION_CODES.LOLLIPOP)
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_challenges_list, container, false);
    initView(rootView);
    initToolbar();
    initRecycler();
    getData();

    return rootView;
  }

  private void initRecycler() {
    data = new ArrayList<>();
    mLayoutManager = new LinearLayoutManager(getActivity());
    recyclerview.setLayoutManager(mLayoutManager);
    adapter = new ChallengesAdapter(data, getActivity(), this);
    recyclerview.setAdapter(adapter);

    Paginate.with(recyclerview, this)
        .setLoadingTriggerThreshold(3)
        .addLoadingListItem(false)
        .build();
  }

  private void getData() {

     swipeRefresh.setRefreshing(true);
    WebRequests.GetActiveChallenges(currentPage, new onResult() {
      @Override
      public void onSuccess(Object object) {

        ArrayList<Challenge> list = (ArrayList<Challenge>) object;
        data.addAll(list);
        adapter.notifyDataSetChanged();

        if (list.size() == 10) {
          currentPage++;
          hasMore = true;
        } else {
          hasMore = false;
        }
        loadingInProgress = false;
        swipeRefresh.setRefreshing(false);


      }

      @Override
      public void onFail(Object object) {
        Toast.makeText(getActivity(), "Something went wrong, try again later",
            Toast.LENGTH_SHORT).show(); 
        swipeRefresh.setRefreshing(false);

      }
    });

  } 

  public ChallengesListFragment() {
   } 

  @Override
  public void onRefresh() {
    currentPage = 1;
    loadingInProgress = true;
    getData();
   }

  @Override
  public void onLoadMore() {
    loadingInProgress = true;
     Handler mHandler = new Handler();
    final Runnable hintRunnable = new Runnable() {
      @Override
      public void run() {
        getData();
      }
    };
    mHandler.postDelayed(hintRunnable, 1500);

  }

  @Override
  public boolean isLoading() {
    return loadingInProgress;
  }

  @Override
  public boolean hasLoadedAllItems() {
    return !hasMore;
  } 

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多