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\npublic 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);\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n加载更多预订
\n\nprivate 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}\nRun Code Online (Sandbox Code Playgroud)\n
将适配器设置为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)
| 归档时间: |
|
| 查看次数: |
2508 次 |
| 最近记录: |