RecyclerView grid layout manager doesn't center items

16,413

Solution 1

You have to use layout gravity to make it center & need to change match-parent to wrap_content, also you have to assign layout gravity runtime. try this code:

Adapter item layout:

 <?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"
            android:layout_margin="10dp"
            android:descendantFocusability="blocksDescendants"
            android:orientation="vertical">

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="right"
                    android:id="@+id/top_header_rl"
                    android:background="@color/app_header_color"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/textViewSceneKK"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:gravity="center"
                        android:shadowDx="-1"
                        android:shadowDy="-1"
                        android:shadowRadius="1"
                        android:text="Heder name"
                        android:textSize="26sp" />

                    <TextView
                        android:id="@+id/textViewSceneName"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="10dp"
                        android:clickable="false"
                        android:gravity="center"
                        android:text="Footer name"
                        android:longClickable="false"
                        android:textSize="25sp" />
                </LinearLayout>

                <!--<View-->
                <!--android:id="@+id/filterView"-->
                <!--android:layout_width="match_parent"-->
                <!--android:layout_height="match_parent"-->
                <!--android:clickable="false"-->
                <!--android:longClickable="false" />-->

                <View
                    android:id="@+id/filterViewClick"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:background="?android:selectableItemBackground"
                    android:focusable="false"
                    android:focusableInTouchMode="false" />


        </FrameLayout>

Adapter Code:

public class CenterGridView extends RecyclerView.Adapter<CenterGridView.CenterGridViewViewHolder> {

            private Context context;
            public CenterGridView(Context context){
                this.context =context;
            }

            @Override
            public CenterGridViewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                return new CenterGridViewViewHolder(LayoutInflater.from(context).inflate(R.layout.new_tiem,parent,false));
            }

            @Override
            public void onBindViewHolder(CenterGridViewViewHolder holder, int position) {

                if(position%2==0){
                    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    params.gravity = Gravity.RIGHT;
                    holder.top_header_rl.setLayoutParams(params);
                }else{
                    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    params.gravity = Gravity.LEFT;
                    holder.top_header_rl.setLayoutParams(params);
                }
            }

            @Override
            public int getItemCount() {
                return 20;
            }

            class CenterGridViewViewHolder extends RecyclerView.ViewHolder{
                private LinearLayout top_header_rl;
                public CenterGridViewViewHolder(View itemView) {
                    super(itemView);
                    top_header_rl = (LinearLayout)itemView.findViewById(R.id.top_header_rl);
                }
            }
        }

Main Activity layout:

<?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:orientation="vertical">

            <com.demostudies.CustomRecyclerView
                android:id="@+id/tests"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></com.demostudies.CustomRecyclerView>

        </LinearLayout>

// Set Adapter

 CustomRecyclerView customRecyclerView = (CustomRecyclerView)findViewById(R.id.tests);
    customRecyclerView.setHasFixedSize(false);
    customRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
    customRecyclerView.setAdapter(new CenterGridView(this));

Solution 2

try this: it's working for me

<androidx.recyclerview.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal|center_vertical"
                >

</androidx.recyclerview.widget.RecyclerView>
Share:
16,413
joe
Author by

joe

Updated on June 15, 2022

Comments

  • joe
    joe about 2 years

    enter image description here

    I inherited some big project with a lot of legacy code and now I'm facing some weird stuff..

    I need to make this screen have recyclerview with grid layout manager, 2 columns. This is what I get. Is there a way to center those icons in the middle of the screen? I tried with gravity, but nothing works. Maybe there is some thing inside all that legacy code that is making problem or this is just recyclerView's issue?

    This is the item's layout (terrible, don't ask..)

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants">
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_view_controller_item_background"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textViewSceneKK"
            android:layout_width="match_parent"
            android:layout_height="@dimen/room_button_height"
            android:layout_gravity="center"
            android:layout_marginLeft="@dimen/row_filter_text_margin_left"
            android:layout_marginRight="@dimen/row_filter_text_margin_left"
            android:gravity="center"
            android:shadowDx="-1"
            android:shadowDy="-1"
            android:shadowRadius="1"
            android:textSize="@dimen/row_scene_kk_text_size" />
    
        <TextView
            android:id="@+id/textViewSceneName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/row_filter_text_margin_bottom"
            android:layout_marginLeft="@dimen/row_filter_text_margin_left"
            android:layout_marginRight="@dimen/row_filter_text_margin_left"
            android:layout_marginTop="@dimen/row_filter_text_margin_top"
            android:clickable="false"
            android:gravity="center"
            android:longClickable="false"
            android:textColor="@color/main_text_color"
            android:textSize="@dimen/row_browser_right_name_text_size" />
    </LinearLayout>
    
    <!--<View-->
    <!--android:id="@+id/filterView"-->
    <!--android:layout_width="match_parent"-->
    <!--android:layout_height="match_parent"-->
    <!--android:clickable="false"-->
    <!--android:longClickable="false" />-->
    
    <View
        android:id="@+id/filterViewClick"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?android:selectableItemBackground"
        android:focusable="false"
        android:focusableInTouchMode="false" />
    

    And fragment't layout:

    <customview.CustomRecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="none" />
    

    And the code:

     customRecyclerView.setHasFixedSize(false);
        customRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
        customRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                R.drawable.line_separator_empty, DividerItemDecoration.VERTICAL_LIST));
    
    customRecyclerView.setAdapter(adapter);
    

    CustomRecyclerView.java

    public class CustomRecyclerView extends RecyclerView {
    
        private boolean enableScroll = true;
    
        public CustomRecyclerView(Context context) {
            super(context);
        }
    
        public CustomRecyclerView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomRecyclerView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public boolean isEnableScroll() {
            return enableScroll;
        }
    
        public void setEnableScroll(boolean enableScroll) {
            this.enableScroll = enableScroll;
        }
    
        @Override
        public int computeVerticalScrollRange() {
            return super.computeVerticalScrollRange();
        }
    
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent e) {
            if (enableScroll) {
                return super.onInterceptTouchEvent(e);
            }
            return false;
        }
    }