java - 滑动刷新后加载更多不起作用

标签 java android

我有一个小问题,我让滑动刷新并加载更多。但如果我滑动刷新,加载更多不起作用。数据只显示第一页,之后的下一页不出来,加载更多也不起作用。

我调用了 clearData、setListeners 和 requestDataFromServer 函数,

那错在哪里呢?

package com.dekikurnia.appcelebrity.profile_list;

import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.dekikurnia.appcelebrity.R;
import com.dekikurnia.appcelebrity.adapters.ProfileAdapter;
import com.dekikurnia.appcelebrity.models.Profile;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;
import java.util.List;

public class ProfileListFragment extends Fragment implements ProfileListContract.View {

    @BindView(R.id.rvProfile)
    RecyclerView rvProfile;
    @BindView(R.id.progressBarProfile)
    ProgressBar pbLoading;
    @BindView(R.id.fab_scroll)
    FloatingActionButton fabScroll;
    @BindView(R.id.swipe_refresh)
    SwipeRefreshLayout swipeRefresh;
    ProfileAdapter adapter;
    LinearLayoutManager linearLayoutManager;
    private ProfileListPresenter profileListPresenter;
    private List<Profile> profileList = new ArrayList<>();

    private String TAG = "ProfileFragment";

    private int pageNo = 1;
    private int previousTotal = 0;
    private boolean loading = true;
    private int totalPages = 3;
    int firstVisibleItem, visibleItemCount, totalItemCount;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        getActivity().setTitle("Ruang Casting");
        View view = inflater.inflate(R.layout.fragment_profile, container, false);
        ButterKnife.bind(this, view);

        setView();
        setListeners();
        profileListPresenter = new ProfileListPresenter(this);
        profileListPresenter.requestDataFromServer();

        fabScroll.setOnClickListener(v -> rvProfile.smoothScrollToPosition(0));

        swipeRefresh.setColorSchemeColors(Color.BLUE, Color.GREEN);
        swipeRefresh.setOnRefreshListener(() -> {
            clearData();
            setListeners();
            profileListPresenter.requestDataFromServer();
        });
        return view;
    }

    @SuppressLint("WrongConstant")
    private void setView(){
        adapter = new ProfileAdapter(getContext(), profileList);
        linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
        rvProfile.setLayoutManager(linearLayoutManager);
        rvProfile.setItemAnimator(new DefaultItemAnimator());
        rvProfile.setAdapter(adapter);
    }

    private void setListeners() {
        rvProfile.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                visibleItemCount = rvProfile.getChildCount();
                totalItemCount = linearLayoutManager.getItemCount();
                firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                if (loading) {
                    if (totalItemCount > previousTotal) {
                        loading = false;
                        previousTotal = totalItemCount;
                    }
                }
                if (!loading && (visibleItemCount + firstVisibleItem) >= totalItemCount
                        && firstVisibleItem >= 0
                        && totalItemCount >= totalPages) {
                    profileListPresenter.getMoreData(pageNo);
                    loading = true;
                }

                if (dy > 0 && fabScroll.getVisibility() == View.VISIBLE) {
                    fabScroll.hide();
                } else if (dy < 0 && fabScroll.getVisibility() != View.VISIBLE) {
                    fabScroll.show();
                }
            }
        });
    }

    @Override
    public void showProgress() {
        swipeRefresh.setRefreshing(true);
    }

    @Override
    public void hideProgress() {
        swipeRefresh.setRefreshing(false);
    }

    @Override
    public void setDataToRecyclerView(List<Profile> profileArrayList) {
        profileList.addAll(profileArrayList);
        adapter.notifyDataSetChanged();
        pageNo++;
    }

    @Override
    public void onResponseFailure(Throwable throwable) {
        Log.e(TAG, throwable.getMessage());
        Toast.makeText(getContext(),"Error fetching Profile",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void clearData() {
        int size = profileList.size();
        profileList.clear();
        adapter.notifyItemRangeRemoved(0, size);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        profileListPresenter.onDestroy();
    }
}

最佳答案

在以下代码段的 setListeners() 方法中:

visibleItemCount = rvProfile.getChildCount();
            totalItemCount = linearLayoutManager.getItemCount();
            firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;
                }
            }
            if (!loading && (visibleItemCount + firstVisibleItem) >= totalItemCount
                    && firstVisibleItem >= 0
                    && totalItemCount >= totalPages) {
                profileListPresenter.getMoreData(pageNo);
                loading = true;
            }

您正在检查 if (!loading && (visibleItemCount + firstVisibleItem) >= totalItemCount)

当您第一次加载更多时,条件是正确的,但在您滑动刷新后,这些值需要设置回 0,以便验证 if 语句并且 getMoreData(pageNo) 可以再次调用

创建一个名为 resetData() 的方法,它将这些值重置回 0 并与其他方法一起调用它:

swipeRefresh.setOnRefreshListener(() -> {
        clearData();
        setListeners();
        profileListPresenter.requestDataFromServer();
    });

希望这对您有所帮助!

关于java - 滑动刷新后加载更多不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57268175/

相关文章:

java - 自定义对象在 Jax-RS 中反序列化很好,但如果它在另一个对象中使用,则它不起作用

java - Selenium服务器并行测试错误: invalid session id

java - 在 Android Studio 中将事件添加到 Google 日历

java - 使用 DateFormat 类获取日期和日期字符串 - Android

java - 可更新的结果集行数

Java Eclipse 使用相对路径引用项目中的文件

android - 无法从我的 fragment 中的 ViewModel 观察 LiveData<MutableList<T>>

java - LibGdx - 安装Android项目

java - 为什么Android中的调用栈是8KB?

java - 如何使用 GraalVM 从 C++ 调用以非基本类型作为参数的 Java 入口点方法