对多个具有不同方向的RecyclerView使用相同的布局

时间:2019-04-29 10:53:55

标签: android kotlin android-recyclerview

我是Android编程的新手,这很难解释,但这是我的情况。

我在public ArrayList<Integer> getLeafValues() { ArrayList<Integer> leafList = new ArrayList<>(); Tree current = this; for (Tree t : current.children) { if (t.children.isEmpty()) { leafList.add(t.data); } else { for (Tree t2 : t.children) { if (t2.children.isEmpty()) { leafList.add(t2.data); } else { for (Tree t3 : t2.children) { if (t3.children.isEmpty()) { leafList.add(t3.data); } } } } } } return leafList; } 中使用相同的layout.xml文件获得了2个RecyclerView

我设置了一个静态ViewHolder,它对于水平滚动RecyclerView以及下面的xml代码都可以正常工作

layout_width

enter image description here

但是第二个垂直滚动的RecyclerView,其中单元格的宽度没有覆盖父级,

是否可以使用与以下相同的布局文件,并能够更改rvFirst.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) 以匹配/填充父级?

enter image description here

layout_width

我可以将<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/_150sdp" android:layout_height="wrap_content" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/activity_vertical_margin" android:orientation="vertical"> <TextView android:id="@+id/tvTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/separator" android:ellipsize="end" tools:text="Title" android:maxLines="1" android:textSize="@dimen/normal_text_size" /> <TextView android:id="@+id/tvDescrip" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" tools:text="Description" android:textSize="@dimen/small_text_size" /> </LinearLayout> </androidx.cardview.widget.CardView> 参数传递给Adapter和ViewHolder,但是我不知道应该在哪里更改布局

isVertical: Boolean

3 个答案:

答案 0 :(得分:1)

在您的Viewholder内部,您必须测试方向(您可以将其作为变量传递给适配器) 然后:

val view = LayoutInflater.from(p0.context).inflate(R.layout.item_layout, p0, false)
if(isVertical){
// width,height
view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}else{
// Here you need to use your 250dp,
// You have to convert the code to Kotlin
float width = getResources().getDimension(R.dimen._150sdp);
view.setLayoutParams(new LayoutParams(width, LayoutParams.WRAP_CONTENT));
}
// No need to pass isVertical to the view holder
return CustomViewHolder(view, isVertical)

答案 1 :(得分:0)

尝试

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/_150sdp"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/ll_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/separator"
            android:ellipsize="end"
            tools:text="Title"
            android:maxLines="1"
            android:textSize="@dimen/normal_text_size" />

        <TextView
            android:id="@+id/tvDescrip"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="1"
            tools:text="Description"
            android:textSize="@dimen/small_text_size" />

    </LinearLayout>
</androidx.cardview.widget.CardView>

在适配器中...

垂直recyclerview中使用此

llMain.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
llMain.setOrientation(LinearLayout.VERTICAL);

在水平recyclerview中使用此

 llMain.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
 llMain.setOrientation(LinearLayout.HORIZONTAL);

答案 2 :(得分:0)

我可以通过覆盖layout_width的{​​{1}}来更改onCreateViewHolder

RecyclerView.Adapter