RecyclerView 网格布局管理器不居中项目

RecyclerView grid layout manager doesn't center items

我继承了一些包含大量遗留代码的大项目,现在我面临着一些奇怪的事情..

我需要让这个屏幕有 recyclerview 和网格布局管理器,2 列。这就是我得到的。有没有办法将这些图标居中放置在屏幕中间?我尝试了重力,但没有任何效果。也许在所有遗留代码中存在某些问题,或者这只是 recyclerView 的问题?

这是项目的布局(糟糕,不要问..)

<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" />

片段布局:

<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" />

代码:

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

您必须使用布局引力使其居中并且需要将 match-parent 更改为 wrap_content,您还必须分配布局引力运行时。试试这个代码:

适配器项目布局:

 <?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>

适配器代码:

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

主要Activity布局:

<?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>

// 设置适配器

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

试试这个: 它对我有用

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