如何使用 JSON API 在 recyclerview 滚动上加载更多数据

如何解决如何使用 JSON API 在 recyclerview 滚动上加载更多数据

我想在 Recyclerview 滚动上加载下一页数据(当用户滚动到底部时)。我再次调用 API 以获取下一页数据并通知适配器,但似乎我做错了什么。请帮助我解决代码的问题。

This is my previous question where all code pasted

这是片段类。

public class LeadsFragment extends Fragment {

    boolean isLoading = false;
    RecyclerView recyclerView;
    LeadsAdapter leadsAdapter;
    ArrayList<LeadModel> rowsArrayList = new ArrayList<>();
    RecyclerView.LayoutManager layoutManager;
    private static final String url = "myurl";

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_leads,container,false);

        StringRequest stringRequest = new StringRequest(url,new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                GsonBuilder gsonBuilder = new GsonBuilder();
                Gson gson = gsonBuilder.create();

                LeadModel leadModelList = gson.fromJson(response,LeadModel.class);
                for (int i = 0; i < leadModelList.getData().size(); i++) {
                    rowsArrayList.add(leadModelList);
                }

                recyclerView.setHasFixedSize(true);
                layoutManager = new linearlayoutmanager(getActivity());
                recyclerView.setLayoutManager(layoutManager);
                leadsAdapter = new LeadsAdapter(getContext(),rowsArrayList,recyclerView);
                recyclerView.setAdapter(leadsAdapter);

            }
        },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                Toast.makeText(getContext(),error.toString(),Toast.LENGTH_SHORT).show();

            }
        });

        RequestQueue queue = Volley.newRequestQueue(getContext());
        queue.add(stringRequest);

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView,int dx,int dy) {
                super.onScrolled(recyclerView,dx,dy);
                linearlayoutmanager linearlayoutmanager = (linearlayoutmanager) recyclerView.getLayoutManager();
                if (!isLoading) {
                    if (linearlayoutmanager != null && linearlayoutmanager.findLastCompletelyVisibleItemPosition() == 10 - 1) {
                        // Last item reached
                        loadMore(); // Note this method
                        isLoading = true;
                    }
                }
            }
        });

        return view;

    }

    private void loadMore() {

        StringRequest stringRequest = new StringRequest(url + "?page=2",LeadModel.class);
                for (int i = 0; i < leadModelList.getData().size(); i++) {
                    rowsArrayList.add(leadModelList);
                }
                leadsAdapter.notifyDataSetChanged();
                isLoading = false;
            }
        },Toast.LENGTH_SHORT).show();

            }
        });

        RequestQueue queue = Volley.newRequestQueue(getContext());
        queue.add(stringRequest);
    }

}

解决方法

这更好用,因为自从我开始在 android 上工作以来我就没有使用过 Volley 库。但这是一个如何实现分页的示例

在您的 XML 中

<androidx.core.widget.NestedScrollView
            android:id="@+id/NestedScroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:orientation="vertical">


                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/HomeRecycler"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:nestedScrollingEnabled="true"
                    tools:listitem="@layout/home_recycler_list_layout" />

                <ProgressBar
                    android:id="@+id/ProgressBar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="gone"/>

            </LinearLayout>
        </androidx.core.widget.NestedScrollView>

和你的班级

ArrayList<LeadModel> rowsArrayList = new ArrayList<>();
SwipeRefreshLayout SwipeDown;
ProgressBar progressBar;
NestedScrollView nestedScrollView;
int Page = 0;
LeadsAdapter leadsAdapter;
RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    nestedScrollView = findViewById(R.id.NestedScroll);
    progressBar = findViewById(R.id.ProgressBar);
    recyclerView= findViewById(R.id.HomeRecycler);

    nestedScrollView.setOnScrollChangeListener(new 
    NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v,int scrollX,int scrollY,int oldScrollX,int oldScrollY) {
            if (scrollY == v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()) {
                Page++;
                progressBar.setVisibility(View.VISIBLE);
                getData(Page);
            }
        }
    });
 
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    leadsAdapter = new LeadsAdapter(getContext(),rowsArrayList,recyclerView);
    recyclerView.setAdapter(leadsAdapter);

    getData(Page);
}

private void getData(int Page) {

    StringRequest stringRequest = new StringRequest(url + "?page="+Page,new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            progressBar.setVisibility(View.INVISIBLE);
            // set Progress dialog Visibility to INVISIBLE or GONE if response is success
            GsonBuilder gsonBuilder = new GsonBuilder();
            Gson gson = gsonBuilder.create();

            LeadModel leadModelList = gson.fromJson(response,LeadModel.class);
            for (int i = 0; i < leadModelList.getData().size(); i++) {
                rowsArrayList.add(leadModelList);
            }
            leadsAdapter.notifyDataSetChanged();
        }
    },new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            Toast.makeText(getContext(),error.toString(),Toast.LENGTH_SHORT).show();

        }
    });

    RequestQueue queue = Volley.newRequestQueue(getContext());
    queue.add(stringRequest);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?