RecyclerView not scrolling to the bottom

18,453

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);
Share:
18,453
Mehul Goel
Author by

Mehul Goel

Updated on June 20, 2022

Comments

  • Mehul Goel
    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:

    http://imgur.com/H5uOLFR

    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
    Mehul Goel over 8 years
    Thanks 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
    Saeed Entezari over 8 years
    @Mehul Goel My recyclerView is in a relativelayout. Would you try it?
  • Saeed Entezari
    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
    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
    JoxTraex over 8 years
    perhaps you should label it correctly because when I look at your answer, its the same on both sides