Переработать наложение вида в androidx.constraintlayout.помощник.виджет.Поток

#android #android-recyclerview #android-constraintlayout #flow

#Android #android-recyclerview #android-constraintlayout

Вопрос:

Столкнувшись с проблемой, в виджете перекрывается вид рециркуляции.Макет потока. Первая установка приложения работает нормально, как исключено, но пользователь прокручивает вверх, и выполненные элементы каждый раз перекрываются, не в состоянии решить проблему, у кого есть идея помочь по этому вопросу.

ConstraintLayout: этот макет определяет процент ширины.

ПОТОК: макет потока автоматически отобразит динамическое текстовое представление в следующей строке, если textview с подходит.

Прикрепляю пример кода для справки.

Активность

 class MainActivity : AppCompatActivity() {
 private lateinit var customAdapter: CustomAdapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val list = intArrayOf(1, 2)
    val listSize = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 4, 4, 4, 4, 4, 44, 4, 4, 4, 4, 4, 4, 5)

    val order_details_list = findViewById<RecyclerView>(R.id.order_details_list)

    //CustomAdapter(this, list)
    customAdapter = CustomAdapter(this@MainActivity, list, listSize)
    val recyclerViewLayoutManager =
        LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
    order_details_list.layoutManager = recyclerViewLayoutManager
    order_details_list.adapter = customAdapter

 }
} 
 

Адаптер

        class CustomAdapter(
    private val context: Context?,
    private val list: IntArray,
    private val listSize: IntArray
       ) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater =
            parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val view = inflater.inflate(R.layout.row_order_layout_new, parent, false)
        return DetailViewHolder(view)
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        val holder = viewHolder as DetailViewHolder
        setData(holder, listSize)
    }

    private fun setData(holder: DetailViewHolder, intArray: IntArray) {
        System.out.println(" array ====> "   "setData")
        val intArrays = IntArray(intArray.size)
        var count = 1;
        for (i in intArray.indices) {
            println(i)

            val orderNo = TextView(context)
            orderNo.text = "orderNo "   i
            orderNo.id = count
            orderNo.isSingleLine = true
            orderNo.ellipsize = (TextUtils.TruncateAt.END)
            val lp = ConstraintLayout.LayoutParams(0, ConstraintLayout.LayoutParams.WRAP_CONTENT)
            lp.matchConstraintPercentWidth = 0.5.toFloat()
            orderNo.layoutParams = lp

            intArrays[i] = count
            count  

            holder.constraintLayout.addView(orderNo)

        }

        System.out.println(" array ====> "   list.size)
        holder.flowLayout.referencedIds = (intArrays)
    }

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

    //Custom ViewHolder
    open class ViewHolder(v: View?) : RecyclerView.ViewHolder(v!!)

    inner class DetailViewHolder(itemView: View) : ViewHolder(itemView) {
        var constraintLayout: ConstraintLayout = itemView.findViewById(R.id.main_Layout)
        var flowLayout: androidx.constraintlayout.helper.widget.Flow = itemView.findViewById(R.id.flowLayout);
    }
}
 

XML

 <?xml version="1.0" encoding="utf-8"?>
  <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@ id/main_Layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.constraintlayout.helper.widget.Flow
    android:id="@ id/flowLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e4e4e4"
    app:flow_horizontalAlign="start"
    app:flow_horizontalBias="0"
    app:flow_horizontalStyle="packed"
    app:flow_maxElementsWrap="10"
    app:flow_verticalAlign="top"
    app:flow_verticalBias="0"
    app:flow_verticalGap="0dp"
    app:flow_wrapMode="chain"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="@color/black" />

  </androidx.constraintlayout.widget.ConstraintLayout>
 

Прикрепляю снимки экрана для справки.

введите описание изображения здесь
введите описание изображения здесь

Ответ №1:

Решение: сохраните ссылки на идентификаторы и повторно используйте их позже. RecyclerView не знал, как справиться с вашим случаем из-за возможности повторного использования и программно созданных представлений.

Дополнительно: если вы создаете представления программно, вы можете использовать View.generateViewId() для генерации viewId .

Код:

 inner class DetailViewHolder(itemView: View) : ViewHolder(itemView) {
        private val constraintLayout: ConstraintLayout = itemView.findViewById(R.id.main_Layout)
        private val flowLayout: androidx.constraintlayout.helper.widget.Flow =
            itemView.findViewById(R.id.flowLayout)

        private val ids = mutableListOf<Int>()

        fun setData(intArray: IntArray) {

            if (ids.size  == 0) {
                for (i in intArray.indices) {
                    println(i)

                    val orderNo = TextView(context)
                    orderNo.text = "orderNo "   i
                    orderNo.setTextColor(Color.BLACK)
                    orderNo.id = View.generateViewId()
                    orderNo.isSingleLine = true
                    orderNo.ellipsize = (TextUtils.TruncateAt.END)
                    val lp =
                        ConstraintLayout.LayoutParams(0, ConstraintLayout.LayoutParams.WRAP_CONTENT)
                    lp.matchConstraintPercentWidth = 0.5.toFloat()
                    orderNo.layoutParams = lp

                    ids.add(orderNo.id)
                    constraintLayout.addView(orderNo)

                }
            }

            flowLayout.referencedIds = ids.toIntArray()
        }
    }
 

Комментарии:

1. Я обновил то, что вы предложили, но, тем не менее, у меня такая же проблема с перекрытием.

2. @NagarjunaReddy Пожалуйста, дважды проверьте. На моей стороне это работает нормально.