Используйте один и тот же макет для нескольких RecyclerView с различной ориентацией - PullRequest
0 голосов
/ 29 апреля 2019

Я новичок в программировании на Android, это сложно объяснить, но вот моя ситуация.

Я получил 2 RecyclerView s, используя один и тот же файл layout.xml в ViewHolder

Я установил статический layout_width, который отлично работает для горизонтальной прокрутки RecyclerView, код XML ниже

rvFirst.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)

enter image description here

Но 2-й вертикально прокручиваемый RecyclerView,если ширина ячейки не покрывает родительский элемент,

возможно ли использовать тот же файл макета, что и ниже, и иметь возможность изменить layout_width для соответствия / заполнения родительского элемента?

enter image description here

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

Я могу передать параметр isVertical: Boolean как в Adapter, так и в ViewHolder, но я понятия не имею, где мне следует изменить макет

class CustomAdapter(val items: ArrayList<Item>, val isVertical: Boolean = false): RecyclerView.Adapter<CustomViewHolder>() {

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
        val view = LayoutInflater.from(p0.context).inflate(R.layout.item_layout, p0, false)
        return CustomViewHolder(view, isVertical)
    }

    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(p0: CustomViewHolder, p1: Int) {
        items.getOrNull(p1)?.let {
            p0.bindData(it)
        }
    }
}

class CustomViewHolder(val view: View, isVertical: Boolean) : RecyclerView.ViewHolder(view) {

    private val tvTitle: TextView = view.findViewById(R.id.tvTitle)
    private val tvDescrip: TextView = view.findViewById(R.id.tvDescrip)

    fun bindData(item: Item) {
        tvTitle.text = "Title"
        tvDescrip.text = "Description"
    }
}

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Внутри вашей области просмотра вы должны проверить ориентацию (вы можете передать ее как переменную вашему адаптеру), а затем:

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)

0 голосов
/ 29 апреля 2019

Я могу изменить layout_width, переопределив onCreateViewHolder из RecyclerView.Adapter, вот так

class CustomAdapter(val items: ArrayList<Item>, val isVertical: Boolean = false): RecyclerView.Adapter<CustomViewHolder>() {

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
        val view = LayoutInflater.from(p0.context).inflate(R.layout.item_layout, p0, false)
        if (isVertical) {
            view.setLayoutParams(ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
        }
        return CustomViewHolder(view)
    }

}
0 голосов
/ 29 апреля 2019

попробуйте

<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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...