web-dev-qa-db-ja.com

RecyclerViewグリッドレイアウトマネージャーはアイテムを中央に配置しません

enter image description here

私は多くのレガシーコードを含むいくつかの大きなプロジェクトを継承しましたが、今はいくつかの奇妙なことに直面しています。

この画面にグリッドレイアウトマネージャー、2列のrecyclerviewを表示する必要があります。これは私が得るものです。これらのアイコンを画面の中央に配置する方法はありますか?重力で試しましたが、何も機能しません。たぶん、問題を引き起こしているすべてのレガシーコードの中に何かがあるのでしょうか、それともこれは単に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;
    }
}
7
joe

レイアウトグラビティを使用して中央に配置し、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);
                }
            }
        }

主なアクティビティのレイアウト:

<?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));
3
vivek mahajan