I'm trying to add some date on scroll top in a recyclerview. it is work, except the scroll, it mess everything up when some new data is added.
I saw this topics:
but none of them solved my problem.
maybe someone can help me with this...
I get some data using volley, like so:
try { //Getting json json = array.getJSONObject(i); //Adding data to the object PostObj.setImageUrl(json.getString(Config.TAG_PPIC)); ... } catch (JSONException e) { e.printStackTrace(); } //Adding object to the list listLf.add(0, PostObj); //0, postobj } //Notifying the adapter that data has been added or changed //adapter.notifyDataSetChanged(); the scroll will jump to position 0 adapter.notifyItemRangeChanged(0, adapter.getItemCount()); // still not working } I tried to add adapter.notifyItemRangeChanged(0, adapter.getItemCount()); but still the same thing.
also I tried:
// Save state private Parcelable recyclerViewState; recyclerViewState = recyclerView.getLayoutManager().onSaveInstanceState(); // Restore state recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState); and it doesn't work too. maybe I place it in the wrong place or something...
I want some suggestions what I'm doing wrong and how can I get the new data, notify the adapter without mess the scroll position?
edit---------------------------------- full class:
public class Comments extends BaseActivity { private List<LfGetSet> listLf; //Creating Views private RecyclerView recyclerView; private RecyclerView.LayoutManager layoutManager; private RecyclerView.Adapter adapter; //Volley Request Queue private RequestQueue requestQueue; private String requestCount = "0"; private String lastrequestCount = "0"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewGroup content = (ViewGroup) findViewById(R.id.content_frame); getLayoutInflater().inflate(R.layout.activity_comments, content, true); //Initializing Views recyclerView = (RecyclerView) findViewById(R.id.recyclerViewLf); recyclerView.setHasFixedSize(true); //layoutManager = new LinearLayoutManager(this); final LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setStackFromEnd(true); recyclerView.setLayoutManager(layoutManager); //Initializing our list listLf = new ArrayList<>(); requestQueue = Volley.newRequestQueue(this); //Calling method to get data to fetch data getData(); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (isLastItemDisplaying(recyclerView)) { getData(); } } }); //initializing our adapter adapter = new LfAdapter(listLf, this); //Adding adapter to recyclerview recyclerView.setAdapter(adapter); } private JsonArrayRequest getDataFromServer(String requestCount) { ... return jsonArrayRequest; } //This method will get data from the web api private void getData() { //Adding the method to the queue by calling the method getDataFromServer requestQueue.add(getDataFromServer(requestCount)); lastrequestCount = requestCount; //Incrementing the request counter requestCount++; } //This method will parse json data private void parseData(JSONArray array) { for (int i = 0; i < array.length(); i++) { //Creating the object LfGetSet PostObj = new LfGetSet(); JSONObject json = null; try { //Getting json json = array.getJSONObject(i); //Adding data to the object PostObj.setImageUrl(json.getString(Config.TAG_PPIC)); ... } catch (JSONException e) { e.printStackTrace(); } //Adding object to the list listLf.add(0, PostObj); //0, postobj } //Notifying the adapter that data has been added or changed adapter.notifyDataSetChanged(); } //This method would check that the recyclerview scroll has reached the bottom or not private boolean isLastItemDisplaying(RecyclerView recyclerView) { if (recyclerView.getAdapter().getItemCount() != 0) { int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == 1 && lastrequestCount != requestCount && requestCount != "0") return true; } return false; } }
notifyItemInsertedmethod.adapter.notifyItemInserted(0);,adapter.notifyItemInserted(adapter.getItemCount())and none of them work. they seems to group all posts in the first position and show them when scroll bottom and top again... Did I do something wrong? @RobCo