RecyclerView grid layout manager doesn't center items

joe picture joe · May 9, 2017 · Viewed 13.7k times · Source

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

Answer

vivek mahajan picture vivek mahajan · May 9, 2017

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