RecyclerView not scrolling to the bottom
Solution 1
Thanks to everyone who responded, but turns out the problem was the version of RecyclerView I was compiling.
Previously I was compiling this
compile 'com.android.support:recyclerview-v7:22.0.0'
But I changed it to this and it worked
compile 'com.android.support:recyclerview-v7:22.2.0'
Credits to @roi divon for the answer: CoordinatorLayout with RecyclerView & CollapsingToolbarLayout
Solution 2
You can use these lines to scroll recyclerview to:
list.add(0, group);
adapter.notifyItemInserted(0);
recyclerview.scrollToPosition(0);
Mehul Goel
Updated on June 20, 2022Comments
-
Mehul Goel almost 2 years
I followed the recyclerview guidelines and built one for the app I am making, but it does not scroll to the bottom for some reason. I compared it with google code snippets, as well as other code snippets online and can't see the difference. I have posted a picture and the code I am using. I am using tabs, therefore the recyclerview is populated in a fragment.
What the app looks like:
the adapter class:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<Group> groups; // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and // you provide access to all the views for a data item in a view holder public class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a string in this case public TextView groupName; public TextView groupDate; public TextView groupLocation; public TextView className; public ViewHolder(View v) { super(v); groupName = (TextView) v.findViewById(R.id.groupName); groupDate = (TextView) v.findViewById(R.id.groupDate); groupLocation = (TextView) v.findViewById(R.id.groupLocation); className = (TextView) v.findViewById(R.id.className); } } /* * TODO: finish this method */ public void add(int position, String item) { notifyItemInserted(position); } public void remove(String item) { int position = groups.indexOf(item); groups.remove(position); notifyItemRemoved(position); } // Provide a suitable constructor (depends on the kind of dataset) public MyAdapter(List<Group> groupsList) { groups = groupsList; Log.d("TEST", "Number of Groups: " + Integer.toString(groups.size())); } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.group_view, parent, false); // set the view's size, margins, paddings and layout parameters ViewHolder vh = new ViewHolder(v); return vh; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element final Group group = groups.get(position); // holder.groupName.setText(group.getName()); holder.groupName.setText(group.getName()); holder.groupDate.setText(group.getFormattedDate()); holder.groupLocation.setText(group.getLocation()); holder.className.setText(group.getParent().getName()); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return groups.size(); } }
The Fragment class:
public class groupsFragment extends Fragment implements GroupLeaver, GroupRetriever { private RecyclerView rv; private List<Group> groups; private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstance){ super.onCreate(savedInstance); Log.d("TEST", "Entered onCreate"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { AppMain.getController().retrieveGroups(groupsFragment.this); Log.d("TEST", "Entered onCreateView"); View rootView = inflater.inflate(R.layout.groups_fragment, container, false); rv = (RecyclerView) rootView.findViewById(R.id.recyclerView); rv.setLayoutManager(new LinearLayoutManager(getActivity())); Log.d("TEST", "Size of LIST: " + Integer.toString(groups.size())); MyAdapter adapter = new MyAdapter(groups); rv.setAdapter(adapter); return rootView; } @Override public void onMyGroupsFound(List<Group> groups) { Log.d("TEST", "Entered onMyGroupsFound"); Logg.info(this.getClass(), "Found %d groups for member %s", groups.size(), User.getCurrentUser().getDisplayName()); this.groups = groups; } @Override public void onGroupLeft(Group oldGroup) { } @Override public void onGroupLeftFailed(Group group, ParseException e) { } }
The xml layout for the recyclerview:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@null"/> </FrameLayout>
The xml layout for the recyclerview items:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:orientation="horizontal"> <LinearLayout android:layout_height="wrap_content" android:layout_width="0dp" android:layout_weight="3" android:orientation="vertical"> <TextView android:id="@+id/groupName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Group Name" /> <TextView android:id="@+id/groupDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Group Date" /> <TextView android:id="@+id/groupLocation" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Group Location" /> </LinearLayout> <LinearLayout android:layout_height="wrap_content" android:layout_width="0dp" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/className" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="right" android:text="Class Name" /> </LinearLayout> </LinearLayout> </FrameLayout>
-
Mehul Goel over 8 yearsThanks for responding but that is not the problem. I've attached a repo below with google's code example. They use framelayouts too: github.com/udacity/Advanced_Android_Development/tree/…
-
Saeed Entezari over 8 years@Mehul Goel My recyclerView is in a relativelayout. Would you try it?
-
Saeed Entezari over 8 years@MehulGoel And do something else. First set the adapter and then set the layoutManager of the recyclerview. see if that works
-
Saeed Entezari over 8 years@MehulGoel This is to make sure but if you are using android studio and you changed views file then do a Clean Project before compile. Sometimes views don't change when you debug the project...
-
JoxTraex over 8 yearsperhaps you should label it correctly because when I look at your answer, its the same on both sides