无尽滚动RecyclerView总是返回顶部

wiz*_*one 3 android infinite-scroll endlessscroll android-recyclerview

我对无限滚动有疑问。每次加载更多数据时,它都会返回到顶部视图。我想要的是 RecyclerView 在加载新数据时保持在最后一个位置。\n我正在尝试实现此代码https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-回收视图

\n\n

这是无限滚动代码

\n\n
public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener{\n// The minimum amount of items to have below your current scroll position\n// before loading more.\nprivate int visibleThreshold = 30;\n// The current offset index of data you have loaded\nprivate int currentPage = 0;\n// The total number of items in the dataset after the last load\nprivate int previousTotalItemCount = 0;\n// True if we are still waiting for the last set of data to load.\nprivate boolean loading = true;\n// Sets the starting page index\nprivate int startingPageIndex = 0;\n\nRecyclerView.LayoutManager mLayoutManager;\n\npublic EndlessRecyclerViewScrollListener(LinearLayoutManager layoutManager) {\n    this.mLayoutManager = layoutManager;\n}\n\npublic int getLastVisibleItem(int[] lastVisibleItemPositions) {\n    int maxSize = 0;\n    for (int i = 0; i < lastVisibleItemPositions.length; i++) {\n        if (i == 0) {\n            maxSize = lastVisibleItemPositions[i];\n        }\n        else if (lastVisibleItemPositions[i] > maxSize) {\n            maxSize = lastVisibleItemPositions[i];\n        }\n    }\n    return maxSize;\n}\n\n// This happens many times a second during a scroll, so be wary of the code you place here.\n// We are given a few useful parameters to help us work out if we need to load some more data,\n// but first we check if we are waiting for the previous load to finish.\n@Override\npublic void onScrolled(RecyclerView view, int dx, int dy) {\n    int lastVisibleItemPosition = 0;\n    int totalItemCount = mLayoutManager.getItemCount();\n\n    if (mLayoutManager instanceof LinearLayoutManager) {\n        lastVisibleItemPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();\n    }\n\n    // If the total item count is zero and the previous isn\'t, assume the\n    // list is invalidated and should be reset back to initial state\n\n    if (totalItemCount < previousTotalItemCount) {\n        this.currentPage = this.startingPageIndex;\n        this.previousTotalItemCount = totalItemCount;\n        if (totalItemCount == 0) {\n            this.loading = true;\n        }\n    }\n    // If it\xe2\x80\x99s still loading, we check to see if the dataset count has\n    // changed, if so we conclude it has finished loading and update the current page\n    // number and total item count.\n    if (loading && (totalItemCount > previousTotalItemCount)) {\n        loading = false;\n        previousTotalItemCount = totalItemCount;\n    }\n\n    // If it isn\xe2\x80\x99t currently loading, we check to see if we have breached\n    // the visibleThreshold and need to reload more data.\n    // If we do need to reload some more data, we execute onLoadMore to fetch the data.\n    // threshold should reflect how many total columns there are too\n    if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) {\n        currentPage++;\n        onLoadMore(currentPage, totalItemCount, view);\n        loading = true;\n    }\n}\n\n// Call this method whenever performing new searches\npublic void resetState() {\n    this.currentPage = this.startingPageIndex;\n    this.previousTotalItemCount = 0;\n    this.loading = true;\n}\n\n// Defines the process for actually loading more data based on page\npublic abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view);\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

创建视图时

\n\n
@Override\npublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){\n    View view = inflater.inflate(R.layout.booking_fragment, container, false);\n\n    recyclerView = (RecyclerView) view.findViewById(R.id.bookingRecyclerView);\n    linearLayoutManager = new LinearLayoutManager(getActivity());\n    recyclerView.setLayoutManager(linearLayoutManager);\n    recyclerView.setHasFixedSize(true);\n\nscrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {\n        @Override\n        public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {\n            // Triggered only when new data needs to be appended to the list\n            // Add whatever code is needed to append new items to the bottom of the list\n\n\n            if(CurrentStatus.equals("notSearch")){\n                if (current < Integer.parseInt(TP)) {\n                    current++;\n                    loadMoreBookings(sort);\n                }\n                else if(current == Integer.parseInt(TP)){\n                    Toast.makeText(getActivity(),"No More Data to Load", Toast.LENGTH_SHORT).show();\n                }\n            }else{\n                if (current < Integer.parseInt(TP)) {\n                    current++;\n                    searchMoreBookings(search, sort);\n                }\n                else if(current == Integer.parseInt(TP)){\n                    Toast.makeText(getActivity(),"No More Data to Be Load", Toast.LENGTH_SHORT).show();\n                }\n            }\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n

加载更多预订

\n\n
private void loadMoreBookings(final String sort){\n    CurrentStatus = "notSearch";\n    final ProgressDialog progressDialog = new ProgressDialog(getActivity());\n    progressDialog.setMessage("Please Wait While Retrieving Data");\n    progressDialog.setCancelable(false);\n    progressDialog.show();\n    StringRequest requesting = new StringRequest(Request.Method.POST, URL,\n            new Response.Listener<String>() {\n                @Override\n                public void onResponse(String JSONString) {\n                    progressDialog.dismiss();\n                    try{\n                        JSONObject jsonTP = new JSONObject(JSONString);\n                        JSONArray jsonArrayB = jsonTP.getJSONArray("Data");\n                        for(int i = 0; i < jsonArrayB.length(); i++){\n                            JSONObject o = jsonArrayB.getJSONObject(i);\n                            Booking list = new Booking(\n                                    o.getString("bookID"),\n                                    o.getString("userEmail"),\n                                    o.getString("paymentMethod"),\n                                    o.getString("paymentStatus"),\n                                    o.getString("totalPrice"),\n                                    o.getString(String.valueOf("securityCode")),\n                                    o.getString(String.valueOf("travelDate")),\n                                    o.getString("paymentID"),\n                                    o.getString("userFN"),\n                                    o.getString("userLN"),\n                                    o.getString(String.valueOf("createdAt")),\n                                    o.getString("tTM"),\n                                    o.getString("messageToCustomer"),\n                                    o.getString("messageFromMerchant"),\n                                    o.getString("wCN"),\n                                    o.getString("wLocation"),\n                                    o.getString("wWebsite")\n                            );\n                            listBooking.add(list);\n                            count++;\n                        }\n                        Toast.makeText(getActivity(), "Data : "+count, Toast.LENGTH_SHORT).show();\n                        adapter = new BookingAdapter(listBooking,getActivity());\n                        recyclerView.setAdapter(adapter);\n                    } catch (JSONException e) {\n                        loadMoreBookings(sort);\n                    }\n                }\n            },\n            new Response.ErrorListener() {\n                @Override\n                public void onErrorResponse(VolleyError error) {\n                    progressDialog.dismiss();\n                    Toast.makeText(getActivity().getApplicationContext(), "Failed To Retrieve Data. Please Try Again.",Toast.LENGTH_LONG).show();\n                }\n            }\n    ){\n        @Override\n        protected Map<String, String> getParams() throws AuthFailureError {\n            Map<String,String> params = new HashMap<String, String>();\n            String user = getActivity().getIntent().getStringExtra("username");\n            params.put("username", user);\n            params.put("currentpage", String.valueOf(current));\n            params.put("sorting", sort);\n            return params;\n        }\n    };\n    RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());\n    requestQueue.add(requesting);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Om *_*ers 6

将适配器设置为onCreateView()

   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view = inflater.inflate(R.layout.booking_fragment, container, false);

        recyclerView = (RecyclerView) view.findViewById(R.id.bookingRecyclerView);
        linearLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(linearLayoutManager);

 adapter = new BookingAdapter(listBooking,getActivity());
                            recyclerView.setAdapter(adapter);

    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


                if(CurrentStatus.equals("notSearch")){
                    if (current < Integer.parseInt(TP)) {
                        current++;
                        loadMoreBookings(sort);
                    }
                    else if(current == Integer.parseInt(TP)){
                        Toast.makeText(getActivity(),"No More Data to Load", Toast.LENGTH_SHORT).show();
                    }
                }else{
                    if (current < Integer.parseInt(TP)) {
                        current++;
                        searchMoreBookings(search, sort);
                    }
                    else if(current == Integer.parseInt(TP)){
                        Toast.makeText(getActivity(),"No More Data to Be Load", Toast.LENGTH_SHORT).show();
                    }
                }
            }
Run Code Online (Sandbox Code Playgroud)

不要每次都设置适配器,只需通知适配器项插入的位置即可。

private void loadMoreBookings(final String sort){
    CurrentStatus = "notSearch";
    final ProgressDialog progressDialog = new ProgressDialog(getActivity());
    progressDialog.setMessage("Please Wait While Retrieving Data");
    progressDialog.setCancelable(false);
    progressDialog.show();
    StringRequest requesting = new StringRequest(Request.Method.POST, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String JSONString) {
                    progressDialog.dismiss();
                    try{
                        JSONObject jsonTP = new JSONObject(JSONString);
                        JSONArray jsonArrayB = jsonTP.getJSONArray("Data");
                        for(int i = 0; i < jsonArrayB.length(); i++){
                            JSONObject o = jsonArrayB.getJSONObject(i);
                            Booking list = new Booking(
                                    o.getString("bookID"),
                                    o.getString("userEmail"),
                                    o.getString("paymentMethod"),
                                    o.getString("paymentStatus"),
                                    o.getString("totalPrice"),
                                    o.getString(String.valueOf("securityCode")),
                                    o.getString(String.valueOf("travelDate")),
                                    o.getString("paymentID"),
                                    o.getString("userFN"),
                                    o.getString("userLN"),
                                    o.getString(String.valueOf("createdAt")),
                                    o.getString("tTM"),
                                    o.getString("messageToCustomer"),
                                    o.getString("messageFromMerchant"),
                                    o.getString("wCN"),
                                    o.getString("wLocation"),
                                    o.getString("wWebsite")
                            );
                            listBooking.add(list);
                            adapter.notifyItemInserted(count);
                            count++;
                        }
                        Toast.makeText(getActivity(), "Data : "+count, Toast.LENGTH_SHORT).show();

                    } catch (JSONException e) {
                        loadMoreBookings(sort);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressDialog.dismiss();
                    Toast.makeText(getActivity().getApplicationContext(), "Failed To Retrieve Data. Please Try Again.",Toast.LENGTH_LONG).show();
                }
            }
    ){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String,String> params = new HashMap<String, String>();
            String user = getActivity().getIntent().getStringExtra("username");
            params.put("username", user);
            params.put("currentpage", String.valueOf(current));
            params.put("sorting", sort);
            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
    requestQueue.add(requesting);
}
Run Code Online (Sandbox Code Playgroud)