Large gap forms between RecyclerView items when scrolling down

31,681

Solution 1

Luksprog's answer to Gabriele Mariotti's answer works.

According to the doc

With the release 2.3.0 there is an exciting new feature to the LayoutManager API: auto-measurement! This allows a RecyclerView to size itself based on the size of its contents. >This means that previously unavailable scenarios, such as using WRAP_CONTENT >for a dimension of the RecyclerView, are now possible. You’ll find all built in LayoutManagers now support auto-measurement.

Due to this change, make sure to double check the layout parameters of your item views: previously ignored layout parameters (such as MATCH_PARENT in the scroll direction) will now be fully respected.

In your item layout you have to change:

android:layout_height="match_parent"

with

android:layout_height="wrap_content" 

Solution 2

change in Recycler view match_parent to wrap_content:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

Also change in item layout xml

Make parent layout height match_parent to wrap_content

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
        />

Solution 3

This happened to me many times!

All you need to do is... make layout_height of row file wrap_content and your problem solved..

android:layout_height="wrap_content"

Happy coding!

Solution 4

Its because you are using match_parent in height of root view of the row item in your vertically oriented listview/recyclerview. When you use that the item expands completely wrt to its parent. Use wrap_content for height when the recyclerview is vertically oriented and for width when it is horizantally oriented.

Share:
31,681
PlanetAstro_William
Author by

PlanetAstro_William

A Jack of all Titanics System.out.print("Programmer"); A Writer of Books A Scientist of the World

Updated on October 30, 2020

Comments

  • PlanetAstro_William
    PlanetAstro_William over 3 years

    I'm making a ToDo list app, and while testing it, for some reason, a huge gap forms between the items whenever I try to scroll down. It always happens whenever I Drag and Drop the items, but I don't see any errors with my ItemTouchHelper adapter and callback class. It would be awesome if you can help me out.

    Before: Before

    After: After

    RecyclerAdapter.java

    public class RecyclerAdapter extends                                                                                                                                 
    
    RecyclerView.Adapter<RecyclerAdapter.RecyclerVH> implements ItemTouchHelperAdapter{
    private LayoutInflater layoutInflater;
    ArrayList<Info> data;
    Context context;
    
    public RecyclerAdapter(Context context) {
        layoutInflater = LayoutInflater.from(context);
        this.context = context;
    }
    
    public void setData(ArrayList<Info> data) {
        this.data = data;
        notifyDataSetChanged();
    }
    
    @Override
    public RecyclerVH onCreateViewHolder(ViewGroup viewGroup, int position) {
        View view = layoutInflater.inflate(R.layout.custom_row, viewGroup, false);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("R.A onClick Owen", "onClick method triggered");
            }
        });
        RecyclerVH recyclerVH = new RecyclerVH(view);
        return recyclerVH;
    }
    
    @Override
    public void onBindViewHolder(RecyclerVH recyclerVH, int position) {
        Log.d("RecyclerView", "onBindVH called: " + position);
    
        final Info currentObject = data.get(position);
        // Current Info object retrieved for current RecyclerView item - USED FOR DELETE
        recyclerVH.listTitle.setText(currentObject.title);
        recyclerVH.listContent.setText(currentObject.content);
    
        /*recyclerVH.listTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Open new Activity containing note content
                Toast.makeText(this, "Opening: " + currentObject.title, Toast.LENGTH_LONG).show();
            }
        });*/
    }
    
    public void deleteItem(int position) {
        DBInfo dbInfo = new DBInfo(context);
        dbInfo.deleteNote(data.get(position));
        // Deletes RV item/position's Info object
    
        data.remove(position);
        // Removes Info object at specified position
    
        notifyItemRemoved(position);
        // Notifies the RV that item has been removed
    }
    
    
    @Override
    public int getItemCount() {
        return data.size();
    }
    
    // This is where the Swipe and Drag-And-Drog methods come into place
    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        // Swapping positions
        // ATTEMPT TO UNDERSTAND WHAT IS GOING ON HERE
        Collections.swap(data, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
        return true;
    }
    
    @Override
    public void onItemDismiss(int position) {
        // Deleting item from RV and DB
        deleteItem(position);
    }
    
    class RecyclerVH extends RecyclerView.ViewHolder implements View.OnClickListener{
        // OnClickListener is implemented here
        // Can also be added at onBindViewHolder above
        TextView listTitle, listContent;
    
        public RecyclerVH(View itemView) {
            super(itemView);
    
            listTitle = (TextView) itemView.findViewById(R.id.title);
            listContent = (TextView) itemView.findViewById(R.id.content);
    
            listTitle.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "Opening: Note" + getLayoutPosition(), Toast.LENGTH_SHORT).show();
            // PS NEVER ADD listTitle VARIABLE AS PUBLIC VARIABLE ABOVE WHICH IS GIVEN VALUE AT ONBINDVH
            // THIS IS BECAUSE THE VALUE WILL CHANGE IF ITEM IS ADDED OR DELETED
        }
    }
    }
    

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fab="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:weightSum="1">
    
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/rounded_corners" />
    
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
    
            <com.melnykov.fab.FloatingActionButton
                android:id="@+id/fab_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginBottom="16dp"
                android:layout_marginRight="16dp"
                android:layout_marginEnd="16dp"
                android:gravity="bottom|end"
                android:onClick="addNote"
                android:src="@drawable/fab_ic_add"
                fab:fab_colorNormal="@color/colorPrimary"
                fab:fab_colorPressed="@color/colorPrimaryDark"
                fab:fab_colorRipple="@color/colorPrimaryDark" />
        </RelativeLayout>
    </FrameLayout>
    </LinearLayout>
    

    custom_row.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <LinearLayout
        android:id="@+id/main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="8dp"
            android:text="@string/test"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/main"
        android:paddingLeft="8dp">
        <TextView
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/test"
            android:textSize="15sp" />
    </LinearLayout>
    </RelativeLayout>
    

    Thank you so much to whoever can help me out. I am pulling my hair out as I type.

    EDIT: I have confirmed that it is not my ItemTouchHelper class that's the problem. (Tried running without it being called, problem still occurs.) Also, it seems that when a dialog is shown and the keyboard brought up, the RecyclerView in the background resolves the problem by itself. After dialog is removed, the problem repeats (i.e. Scrolling puts massive space between items)

  • amos godwin
    amos godwin about 5 years
    if that doesn't work then your recyclerview layout file android:layout_height="wrap_content"
  • Hissaan Ali
    Hissaan Ali almost 5 years
    as @mohit said, we also need to have the parent layout of item_layout as: xml android:layout_height="wrap_content" otherwise it won't work