最近在做新App开发时,使用RecycleView控件Gridlayout分三列展示信息,却遇到了只显示一行数据的Bug,
代码如下:
mBinding.recyclerViewLabel.setLayoutManager(new GridLayoutManager(getActivity,3));
列表子项item.xml
<?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"> <TextView android:id="@+id/tv_lovetalk_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/back_label_cornor" android:layout_gravity="center_horizontal" android:text="@string/lovetalk" android:textSize="@dimen/font_12" android:layout_marginLeft="@dimen/spacing_30" android:layout_marginTop="@dimen/spacing" android:paddingTop="5dp" android:paddingBottom="5dp" android:paddingStart="@dimen/spacing" android:paddingEnd="@dimen/spacing" /> </LinearLayout> recycleView.xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView_label" android:layout_width="match_parent" android:layout_height="140dp" android:layout_below="@id/tv_hot_label" android:layout_marginTop="23dp" android:overScrollMode="never" tools:listitem="@layout/lovetalk_label_item_layout" />
Bug展示:
既然是单行显示,是不是子项把父控件的高度占满了,于是去检查item.xml文件,看到textView高度是wrap_content,就很纳闷儿,既然不是match_parent为啥只能显示一行,发现,还是自己疏忽大意,既然是列表子项,那么他整个最外层的布局文件的高度都不能match_parent,于是发现在最外层的LinerLayout的 android:layout_height="match_parent",大意了啊,执着于TextView控件,却疏忽了其父容器的宽高。
解决方法就出来啦!
一、检查列表子项布局文件的属性,是不是写错了
二、若布局文件找不出来是哪儿的问题,则可以从把item装入RecycleView这个过程中入手!
更改位置:列表的adapter文件。
原理:直接在装入item的时候无视父容器的逻辑,重写onCreateViewHolder()方法
@Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); //重点在inflate里的参数,本来第二个参数是parent,这儿改为null,则父容器的属性对他本身就无效 View convertView = layoutInflater.inflate(R.layout.lovetalk_label_item_layout, null, false); return new BaseViewHolder(convertView); }
第二个方法百度找到的,试了下也可以哦!