EditText号未知的异构视图



我正在研究一个动态视图(不确定这是否是从json文件创建视图的正确词)。

我从JSON文件中获得模式,我已经加强了recycleView及其适配器,到目前为止,每个recycleView项目(必须或不)包含许多EditText,其数量事先未知,因此基于JSON文件,我必须在里面膨胀。

我搜索了很多,但我发现了类似的解决方案异种循环视图:这个想法是使用单独的布局,并根据你的需要在onCreateViewHolder内部膨胀,但发布解决方案的开发人员事先知道什么是所有可能的视图的组合,他只是切换。

class Adapter_base_Display(private val listener: Display_Fragment,
activity: FragmentActivity ,
liste_display : ArrayList<DisplaySections>)
: RecyclerView.Adapter<Base_DisplayViewHolder>() {
private val activityIns = activity
private val liste_display_Recycle_adapter = liste_display

interface Base_DisplayListener {
fun onClickeddisplay(position: Int)
}
private val items = ArrayList<DisplaySections>()
fun setItems(items: ArrayList<DisplaySections>) {
this.items.clear()
this.items.addAll(items)
notifyDataSetChanged()
}
fun clear() {
val size: Int = items.size
items.clear()
notifyItemRangeRemoved(0, size)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Base_DisplayViewHolder {
val binding: ItemDisplayBinding =
ItemDisplayBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return Base_DisplayViewHolder(
binding,
listener as Base_DisplayListener,
activityIns,
parent,
liste_display_Recycle_adapter)
}
override fun getItemCount(): Int = items.size
override fun onBindViewHolder(holder: Base_DisplayViewHolder, position: Int) =
holder.bind(items[position])
}
class Base_DisplayViewHolder(
private val itemBinding: ItemDisplayBinding,
private val listener: Adapter_base_Display.Base_DisplayListener,
private val activityIns: FragmentActivity,
private var parent: ViewGroup,
private val items: ArrayList<DisplaySections>,
) : RecyclerView.ViewHolder(itemBinding.root),
View.OnClickListener {
init {
itemBinding.root.setOnClickListener(this)
}
fun bind(item: DisplaySections) {

itemBinding.textView2.text = item.name

}

override fun onClick(v: View?) {
listener.onClickeddisplay(adapterPosition)

}

}

我想要膨胀多次的EditText

<EditText
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/edittext_isplay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="TextView"
android:maxLines="3"
android:textColor="@color/black"
android:textSize="18sp" />
data class DisplaySections(
val id : Int,
val name : String,
val createdAt : String,
val updatedAt : String,
val displayTypeId : Int,
val  displayCustomFields : List<DisplayCustomFields> // Contains the elements that will be displayed as EditText

基本布局-回收视图项,这是常见的所有场景

<LinearLayout
android:id="@+id/parent_edittext"   // ALl EditText container 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />

</LinearLayout>

<LinearLayout
android:id="@+id/camera_linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:visibility="visible">
<ImageView
android:id="@+id/addphoto"
android:layout_width="316dp"
android:layout_height="250dp"
android:layout_gravity="center"
android:layout_marginTop="@dimen/_20sdp"
android:src="@drawable/ajouter_photo"
app:tint="@color/clear_grey" />
<TextView
android:id="@+id/camera_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Ajouter des photos"
android:textStyle="bold" />
</LinearLayout>

<LinearLayout
android:id="@+id/plus_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_20sdp"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/my_photo_recycle"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>
</LinearLayout>

我要张贴我找到的解决方案。为了解决这个问题,我们绝对必须使用嵌套的RecyclerView;如上所述,我想用相同的公共布局(Imageview)显示一个项目列表。+Textview),但这里棘手的部分是每个项目的动态部分。回顾:每个元素(可能或可能不)包含N-1 (EditText),这取决于它从json文件中获得的内容。

  • 如果您想通过创建多个viewhoolder并根据viewhodertype进行切换来解决此问题";你错了,你只会创建一个无限的布局文件,这没有意义。

  • 如果您创建了多个EditText),只改变可见性,它可能会工作,但如果你得到例如100个EditText从Json文件你不打算手动创建100个EditText。

  • 如果您想以编程方式生成EditText因为你不能在OnbindViewHolder中创建视图,所以你将影响视图回收中的每个项目。函数。

我发现解决这个问题的唯一方法是创建一个父-子RecycleView每当有(EditText),你把它发送给子适配器,并在父适配器中保持父元素的安全。

你也可以在ParentOnbindViewholder中放置一个条件(NULL tester)如果没有数据,就不要调用Child-adapter。

我希望这个解决方案对任何遇到这个问题的人都有用,如果你有另一个解决方案,我将很高兴测试它们。

最新更新