Skip to main content
replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link
URL Rewriter Bot
URL Rewriter Bot
added 38 characters in body
Source Link

fulledit---------------------------------- full class:

full class:

edit---------------------------------- full class:

Source Link

recyclerview add data to the top without mess up scroll?

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:

Link 1

Link 2

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?


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; } }