Resumen de problemas causados por EditText anidado en RecyclerView

1. Desorden de datos

Recientemente, estoy desarrollando un RecycelrVieweditor basado en web, Recyclerviewque incluye Edittextel problema de la confusión de datos al desplazarse, la razón por la cual la confusión de datos se Recyclerviewdebe a la multiplexación.

El método de procesamiento es:

En onBindViewHolder, agregue o elimine TextChangedListener de Edittext en el momento adecuado para solucionar el problema de la confusión de datos. El momento adecuado es agregar un oyente cuando Edittext obtiene el foco y eliminarlo cuando se pierde el foco, para garantizar la exactitud de los datos.

    override fun convert(helper: BaseViewHolder, item: LongTextModel) {
    
    
        val adapter = getAdapter()
        val list = adapter?.data

        val img = helper.getView<ImageView>(R.id.imgCover)
        val imgDescribe = helper.getView<EditText>(R.id.imgDescribe)
        val etContent = helper.getView<EditText>(R.id.etContent)
        
        etContent.setText(item.edit)
        imgDescribe.setText(item.imgDescribe)

        val contentWatcher = object : TextWatcher {
    
    
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
    
    

            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
    
    
            }

            override fun afterTextChanged(s: Editable?) {
    
    
                val value = s.toString()
                item.edit = value
            }

        }


        val describeWatcher = object : TextWatcher {
    
    
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
    
    

            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
    
    
            }

            override fun afterTextChanged(s: Editable?) {
    
    
                val value = s.toString()
                item.imgDescribe = value
            }

        }

        etContent.setOnFocusChangeListener{
    
    _,hasFocus->      
            if (hasFocus){
    
    
                etContent.addTextChangedListener(contentWatcher)
            }else{
    
    
                etContent.removeTextChangedListener(contentWatcher)
            }
        }

        imgDescribe.setOnFocusChangeListener{
    
    _,hasFocus->
        	if (hasFocus){
    
    
                imgDescribe.addTextChangedListener(describeWatcher)
            }else{
    
    
                imgDescribe.removeTextChangedListener(describeWatcher)
            }
        }


    }

2. Sobre edittextel problema que no se puede copiar.

Solo necesito anular onViewAttachedToWindowel método y luego configurarisEnabled

    override fun onViewAttachedToWindow(holder: BaseViewHolder) {
    
    
        super.onViewAttachedToWindow(holder)
        val imgDescribe = holder.getView<EditText>(R.id.imgDescribe)
        val etContent = holder.getView<EditText>(R.id.etContent)
        imgDescribe.isEnabled = false
        imgDescribe.isEnabled = true

        etContent.isEnabled = false
        etContent.isEnabled = true
    }

3. Con respecto al EditText anidado de RecyclerView, se bloquea cuando se activa el teclado

Antes de la modificación:
inserte la descripción de la imagen aquí
Después de la modificación:
inserte la descripción de la imagen aquí

        window.decorView.viewTreeObserver.addOnGlobalLayoutListener {
    
    
            // 除了软键盘以外的可见区域
            val rect = Rect()
            window.decorView.getWindowVisibleDisplayFrame(rect)
            // 计算出剩余高度:  除了状态栏高度、topBar高度、bottomBar高度、键盘高度的剩余高度

            var invisibleHeight: Int = (rect.bottom
                    - ScreenUtils.getStatusBarHeight(this@EditorLongTextActivity) // 状态栏高度
                    - 44.dip2px //标题栏
                    - 44.dip2px //底部菜单栏 R.id.bottomLayout 即图中 图片添加按钮的整个容器的高度
                    )
          
            if (BarUtils.isNavBarVisible(window)) {
    
    
                invisibleHeight -= navBarHeight
            }
            //对尾部 最后一条数据进行修改即可
            var currentIndex = mAdapter.data.size - 1
            mAdapter.data.forEachIndexed {
    
     index, longTextModel ->
                if (longTextModel.focus) {
    
    
                    currentIndex = index
                }
            }
            // 计算出所点击的图片描述的EditText距离RecyclerView顶部的距离
            val etDescView: View? =
                binding.recyclerView.layoutManager?.findViewByPosition(currentIndex)
            if (etDescView != null) {
    
    
                val focusViewTop: Int = etDescView.top
                val itemHeight: Int = etDescView.height
                val differ = focusViewTop + itemHeight - invisibleHeight
                if (differ > 0) {
    
    
                    binding.recyclerView.scrollBy(0, differ)
                }
            }
        }

4. Debido a que el texto de edición recibe el foco, el deslizamiento no es suave

recyclerViewestablecer en

android:descendantFocusability="beforeDescendants"

El artículo de referencia proviene de:
Resuelva el problema de que EditText está bloqueado por el disquete y el diseño emergente del teclado no sube
Varias soluciones al problema de Edittext en RecyclerView

Supongo que te gusta

Origin blog.csdn.net/weixin_44710164/article/details/126387801
Recomendado
Clasificación