【问题标题】:How to use LazyLoader and PullToRefresh in recyclerView?如何在 recyclerView 中使用 LazyLoader 和 PullToRefresh?
【发布时间】:2018-06-11 05:10:45
【问题描述】:

为什么没有人帮助我???我真的需要你的帮助

在我的应用程序中,我想使用 PullToRefreshLazyLoader 功能,为此我编写以下代码并为我工作。

但我有一个问题,当 PullToRefresh recyclerView 和滚动时 recyclerView 不显示更多项目。

我的意思是:当使用 pullToRefresh 时,则不起作用 lazyLoader

我的代码:

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        Constants.listeners.add(this);
        View v = inflater.inflate(R.layout.fragment_auction_current_tab, null);
        ButterKnife.bind(this, v);
        context = getActivity();
        handler = new Handler();
        list = v.findViewById(R.id.list);
        prefsUtils = new PrefsUtils(getActivity());
        apis = ApiClient.getClient().create(APIs.class);
        swipeToRefresh = v.findViewById(R.id.swipeToRefresh);

        jwtToken = Constants.settings.getString("jwt_token", "");

        list_item = getActivity().findViewById(R.id.list_item);
        linearLayoutManager = new LinearLayoutManager(context);
        auctionListAdapter = new AuctionsListAdapter(context, todayModel, R.layout.list_item_auction_normal_new);
        list.setLayoutManager(linearLayoutManager);
        list.setHasFixedSize(true);
        list.setAdapter(auctionListAdapter);
        list.setOnScrollListener(new EndlessRecyclerLinearPage(linearLayoutManager) {
            @Override
            public void onLoadMore(final int current_page) {
                miniLoader.setVisibility(View.VISIBLE);
                Call<AuctionsListResponse> call = apis.getTodatAuctions(jwtToken, current_page, 10);
                call.enqueue(new Callback<AuctionsListResponse>() {
                    @Override
                    public void onResponse(Call<AuctionsListResponse> call, Response<AuctionsListResponse> response) {
                        if (response.isSuccessful()) {
                            if (response.body() != null) {
                                if (response.body().getRes() != null) {
                                    if (response.body().getRes().getToday().size() > 0 && response.body().getRes().getToday() != null) {
                                        miniLoader.setVisibility(View.GONE);
                                        auctionListAdapter.addNewItem(response.body().getRes().getToday());
                                    } else {
                                        miniLoader.setVisibility(View.GONE);
                                    }
                                }
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<AuctionsListResponse> call, Throwable t) {

                    }
                });
            }
        });
        getData();
        swipeToRefresh.setColorSchemeResources(R.color.colorAccent);
        swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                getData();
            }
        });

        return v;
    }

    private void getData() {
        Call<AuctionsListResponse> call = apis.getTodatAuctions(jwtToken, 1, 10);
        call.enqueue(new Callback<AuctionsListResponse>() {
            @Override
            public void onResponse(Call<AuctionsListResponse> call, Response<AuctionsListResponse> response) {
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        if (response.body().getRes() != null) {
                            if (response.body().getRes().getToday().size() > 0 && response.body().getRes().getToday() != null) {
                                todayModel.clear();
                                todayModel.addAll(response.body().getRes().getToday());
                                auctionListAdapter.notifyDataSetChanged();
                                itemsLoader.setVisibility(View.GONE);
                                if (swipeToRefresh != null) {
                                    swipeToRefresh.setRefreshing(false);
                                }
                            }
                        }
                    }
                }
            }

            @Override
            public void onFailure(Call<AuctionsListResponse> call, Throwable t) {

            }
        });
    }
}

我该如何解决这个问题?

【问题讨论】:

  • 孔博士:你已经被告知here你不应该对别人SHOUT,不是吗?如果您的问题中唯一的变化是昵称变化,您真的认为您会得到任何答案吗?
  • @pskink,好的,对不起,亲爱的,但没有人帮助我吗?我需要帮助:(
  • 人们会尽可能提供帮助,如果他们注意到您的问题,您真的不应该在问题的第一行为此哭泣。
  • 你能解释一下你的目标是什么吗?你的问题令人困惑。使用SwipeRefreshLayout刷新?哪个部分不起作用?它抛出异常?数据没有更新?
  • @YosiPramajaya,是的,使用 pullToRefresh 我使用了 SwipeRefreshLayout ,当使用 pullToRefresh 获取更新数据而不是更新数据问题。但是当在回收器上滚动并接收到结束列表时使用 pullToRefresh 时,lazyLoader 不起作用!你能帮助我吗?请

标签: java android android-recyclerview lazy-loading pull-to-refresh


【解决方案1】:

我认为问题出在您的getData() 方法上。

为什么?当您从RecyclerView.Adapter 调用notifyDataSetChanged() 时,它会告诉您的适配器再次检查它拥有的列表,并完全重新绑定和重绘RecyclerView 中的所有内容。但问题是,在您的getData() 中,您只设置了todayModel List,它是在您的片段中的对象引用。

因此,您需要修改 Adapter 中的列表,以使notifyDataSetChanged() 成功。

实际上,您在onLoadMore() 中所做的操作是正确的,您修改了适配器内部 的列表。你应该在getData() 中做同样(或类似)的事情。

示例代码:

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    Constants.listeners.add(this);
    View v = inflater.inflate(R.layout.fragment_auction_current_tab, null);
    ButterKnife.bind(this, v);
    context = getActivity();
    handler = new Handler();
    list = v.findViewById(R.id.list);
    prefsUtils = new PrefsUtils(getActivity());
    apis = ApiClient.getClient().create(APIs.class);
    swipeToRefresh = v.findViewById(R.id.swipeToRefresh);

    jwtToken = Constants.settings.getString("jwt_token", "");

    list_item = getActivity().findViewById(R.id.list_item);
    linearLayoutManager = new LinearLayoutManager(context);
    auctionListAdapter = new AuctionsListAdapter(context, todayModel, R.layout.list_item_auction_normal_new);
    list.setLayoutManager(linearLayoutManager);
    list.setHasFixedSize(true);
    list.setAdapter(auctionListAdapter);
    list.setOnScrollListener(new EndlessRecyclerLinearPage(linearLayoutManager) {
        @Override
        public void onLoadMore(final int current_page) {
            miniLoader.setVisibility(View.VISIBLE);
            getData(currentPage);
        }
    });
    getData(1);
    swipeToRefresh.setColorSchemeResources(R.color.colorAccent);
    swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            getData(1);
        }
    });

    return v;
}

private void getData(int page) {
    Call<AuctionsListResponse> call = apis.getTodatAuctions(jwtToken, page, 10);
    call.enqueue(new Callback<AuctionsListResponse>() {
        @Override
        public void onResponse(Call<AuctionsListResponse> call, Response<AuctionsListResponse> response) {
            if (response.isSuccessful()) {
                if (response.body() != null) {
                    if (response.body().getRes() != null) {
                        if (response.body().getRes().getToday().size() > 0 && response.body().getRes().getToday() != null) {
                            todayModel.clear();
                            todayModel
                                 .addAll(response.body()
                                                 .getRes()
                                                 .getToday());

                            //NOTICE THE DIFFERENCE HERE
                            auctionListAdapter.setModel(todayModel);
                            auctionListAdapter.notifyDataSetChanged();
                            itemsLoader.setVisibility(View.GONE);
                            if (swipeToRefresh != null) {
                                swipeToRefresh.setRefreshing(false);
                            }
                            miniLoader.setVisibility(View.GONE);
                        }
                    }
                }
            }
        }

        @Override
        public void onFailure(Call<AuctionsListResponse> call, Throwable t) {
             itemsLoader.setVisibility(View.GONE);
             if (swipeToRefresh != null) {
                swipeToRefresh.setRefreshing(false);
             }
             miniLoader.setVisibility(View.GONE);
        }
    });
}

在您的AuctionsListAdapter 中添加此方法。就是设置Adapter用来展示数据的列表:

public void setModel(List<Today> todayModel) {
    this.model = todayModel;
}

【讨论】:

  • 你能把我的代码和我的代码一起发送给我吗?请。我是业余爱好者,真的需要你的帮助。请
  • 朋友你在吗?你能帮助我吗?请
  • 我的朋友为什么不回复我? :D
  • 你应该知道,我们大多数人在这里都有真实的生活,这就是为什么我们不能24小时看线程的原因。请耐心等待。
  • 你能帮我的朋友吗,但是这条线的代码是什么:auctionListAdapter.setModel(todayModel);什么添加代码到适配器以供使用setModel代码?
猜你喜欢
  • 2013-05-04
  • 2017-01-12
  • 2013-11-06
  • 2013-01-29
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多