1. Desorden de datos
Recientemente, estoy desarrollando un RecycelrView
editor basado en web, Recyclerview
que incluye Edittext
el problema de la confusión de datos al desplazarse, la razón por la cual la confusión de datos se Recyclerview
debe 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 edittext
el problema que no se puede copiar.
Solo necesito anular onViewAttachedToWindow
el 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:
Después de la modificación:
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
recyclerView
establecer 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