android - 对具有不同方向的多个 RecyclerView 使用相同的布局
问题描述
我得到了 2 RecyclerView
s 都使用相同的 layout.xml 文件ViewHolder
我设置了一个静态layout_width
,它适用于水平滚动 RecyclerView,下面的 xml 代码
rvFirst.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
但是第二个垂直滚动的 RecyclerView,其中单元格的宽度没有覆盖父级,
是否可以使用与下面相同的布局文件并能够更改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>
我可以将isVertical: Boolean
参数传递给适配器和 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"
}
}
解决方案
在您的 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)
推荐阅读
- python - Flask 组织棉花糖模式
- python - 从困在 .filename.py.swp 文件中的 Python 脚本中恢复输出?
- javascript - 带有 javascript 对象的三元表达式
- javascript - JavaScript和php在一段时间后停止工作,只有在我重命名一些变量时才有效
- c++ - 如何在c ++中找到第一个最大值?
- python - 如何使用 python 导入共享点列表项
- r - 如何删除多种语言的停用词?
- bash - 在多个 bash 脚本中包含常用函数
- spring - spring boot添加=在post方法中的数据之后
- sql - 一段时间内总和为零的个人列表