RecyclerView показывает фактически удаленные элементы - PullRequest
0 голосов
/ 30 декабря 2018

Проблема

Я пишу приложение для Android, которое должно обрабатывать переменное количество элементов в RecyclerView.Когда я добавляю элемент, некоторые данные сохраняются в файле конфигурации вместе с UUID.

Либо при запуске приложения, либо когда элемент создается или удаляется пользователем во время выполнения, RecyclerView обновляется и показываетвсе существующие в настоящее время элементы.

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

Однако, когда я пытаюсь вставить новый элемент, он непоказать, а скорее элемент, который был удален ранее во время этого сеанса.

Пытается

Я уже некоторое время ищу решение.Прежде всего, я начал читать документацию снова и снова, думая, что что-то упустил.Я также просмотрел несколько онлайн-примеров того, как правильно удалить элемент из RecyclerView, но не могу заставить его работать.

Код

package com.rappee.protectiveparking.ui

import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import com.rappee.protectiveparking.R
import com.rappee.protectiveparking.core.Resources
import java.util.*

class ScrollerAdapter : RecyclerView.Adapter< ConsoleViewHolder >() , 
DragItemTouchHelperAdapter {

private var stockpile: Queue< String > = LinkedList< String >()
private var holder: MutableList< ConsoleViewHolder > = ArrayList()

fun push( identification: String ) {

    this.stockpile.add( identification )
    this.notifyItemInserted( this.itemCount - 1 )

}

fun remove( position: Int ) {

    this.holder.removeAt( position )
    this.notifyItemRemoved( position )

}

override fun onCreateViewHolder( parent: ViewGroup , type: Int ): ConsoleViewHolder {

    val view: ConsoleViewHolder = ConsoleViewHolder( LayoutInflater.from( parent.context ).inflate( R.layout.console , parent , false ) , this.stockpile.poll() )
    this.holder.add( view )

    return view

}

override fun onBindViewHolder( holder: ConsoleViewHolder , position: Int ) {

    return

}

override fun getItemCount(): Int {

    return this.holder.size + this.stockpile.size

}

override fun onItemMove( from: Int , to: Int ): Boolean {

    Collections.swap( this.holder , to , from )

    for ( i in 0 until this.holder.size ) {

        Resources.CONFIGURATION.push( "${this.holder.get( i ).identification}.${Resources.KEY_POSITION}" , "$i" )

    }

    this.notifyItemMoved( from , to )
    return true

}

}

Поведение

Когда япопробуйте вставить новый элемент, я фактически помещаю UUID в «stockpile» и вызываю «notifyItemInserted», чтобы активировать «onCreateViewHolder».Когда это происходит, я выбираю основной UUID из 'stockpile' в форме String, чтобы передать его конструктору ConsoleViewHolder в качестве параметра.Только когда вызывается этот метод, фактическое представление вставляется в RecyclerView (не мое решение!).

Однако, когда я вставляю новый UUID и обновляю RecyclerView после удаления элемента, этот метод не 'Вызывается так, что новый вид не может быть показан.Единственное, что изменится, это то, что ранее удаленное представление снова всплыло.

МОЙ ВОПРОС: Как я могу исправить это поведение моего RecyclerView, показывающего удаленные элементы вместо недавно добавленных?

1 Ответ

0 голосов
/ 31 декабря 2018

Нет необходимости хранить держатели вида самостоятельно.
Это должно выглядеть примерно так:

private var stockpile = MutableList< String >()

fun push( identification: String ) {
    stockpile.add( identification )
    notifyItemInserted( itemCount - 1 )
}

fun remove( position: Int ) {
    stockpile.removeAt( position )
    notifyItemRemoved( position )
}

override fun onCreateViewHolder( parent: ViewGroup , type: Int ): ConsoleViewHolder {
    val view: ConsoleViewHolder = ConsoleViewHolder( LayoutInflater.from( parent.context ).inflate( R.layout.console , parent , false ) , this.stockpile.poll() )
    return view
}

override fun onBindViewHolder( holder: ConsoleViewHolder , position: Int ) {
    //replace with something sensible you want to show in your view
    view.someTextView.text = stockpile[position].name
    return

}

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

Я думаю, вы плохо понимаете, что делает держатель представления.Удалить private var holder: MutableList< ConsoleViewHolder > = ArrayList() и все ссылки на него. не редактировать виджеты вне onBindViewHolder.Странное поведение, которое вы испытываете, заключается в том, что вы на самом деле не удаляете элемент из базового stockpile, а затем представление о переработчике сбивается с толку, когда вы сообщаете ему о появлении нового элемента, потому что ваш счет истекает.

см. пример в https://developer.android.com/guide/topics/ui/layout/recyclerview для справочной реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...