Хорошо с самого начала, у меня есть RecyclerView, где я хочу изменить цвет записей, если они нажаты.
Recyclerview получает список из базы данных, куда я добавил значение bool, если выбрано представление.
В моем держателе я проверяю, выбрано ли представление, и меняю цвет с помощьюселектор.
Пока все хорошо, но теперь есть проблема.
Задание начинается, старая выбранная запись окрашивается, но когда я щелкаю по другой записи, цвет старой записи исчезает, а по той, которая нажата, ничего не происходит. Я должен снова нажать на старую запись, и с этого момента изменение цвета работает нормально.
метод, вызванный в viewHolder
itemView.view_foreground_nav.isSelected = (table.isSelected)
селектор
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@android:color/darker_gray"
android:state_pressed="true"/>
<item
android:drawable="@android:color/darker_gray"
android:state_selected="true"/>
<item
android:drawable="@android:color/darker_gray"
android:state_focused="true"/>
<item android:drawable="@android:color/white"/>
</selector>
RelativeLayout из держателя, где должен быть изменен цвет
android:id="@+id/view_foreground_nav"
android:layout_width="match_parent"
android:layout_height="@dimen/ic_delete"
android:background="@drawable/recycler_nav_item_background">
переменная вАктивность, установленная в onCreate
private var selectedTable: Table? = null
Метод onClick
if (selectedTable != null) {
var oldSelectedTable = selectedTable
oldSelectedTable?.isSelected = false
productViewModel.updateTable(oldSelectedTable!!)
data.isSelected = true
productViewModel.updateTable(data)
selectedTable = data
} else {
data.isSelected = true
productViewModel.updateTable(data)
selectedTable = data
}
button_add_note.isEnabled = true
observerProduct(selectedTable)
Diffutil
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int):Boolean{
return oldListTable[oldItemPosition].idTable == newListTable[newItemPosition].idTable
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldListTable[oldItemPosition].title == newListTable[newItemPosition].title&&
oldListTable[oldItemPosition].isSelected == newListTable[newItemPosition].isSelected
}
ProductViewModel - это латинит в MainActivity
private lateinit var productViewModel: ProductViewModel
В OnCreate я устанавливаю ViewModel
productViewModel =
ViewModelProviders.of(this).get(ProductViewModel::class.java)
GenericAdapter Call
private fun observerTable() {
productViewModel.getAllTables().observe(this, Observer<List<Table>> { it ->
adapterNav.setItems(it as MutableList<Any>)
})
}
Table Dao
@Query("Select * from main_table")
fun getAllTables(): LiveData<MutableList<Table>>
ProductRepro
private var tableDao: TableDao
private var allTables: LiveData<MutableList<Table>>
init {
var database: ProductDatabase? = ListMasterApplication.database
this.tableDao = database!!.tableDao()
this.allTables = tableDao.getAllTables()
}
var database: ProductDatabase? = ListMasterApplication.database
fun getAllTable(): LiveData<MutableList<Table>> {
return allTables
}
ProductVieModel
private var productRepository: ProductRepository = ProductRepository()
private var liveDataTable: LiveData<MutableList<Table>>
init {
this.liveDataTable = productRepository.getAllTable()
}
fun getAllTables():LiveData<MutableList<Table>>{
return liveDataTable
}
Наблюдатель в MainActivity
private fun observerTable() {
productViewModel.getAllTables().observe(this, Observer<MutableList<Table>> { it ->
adapterNav.setItems(it as MutableList<Any>)
})
}
В наборе GenericAdapter Элементы
fun setItems(items: MutableList<T>) {
val diffCallback = DiffCallback(listItems ,items)
val diffResult = DiffUtil.calculateDiff(diffCallback)
listItems.clear()
listItems.addAll(items)
diffResult.dispatchUpdatesTo(this)
}
Я регистрировал свое Diffutil и при каждом нажатии на разные элементыБревно всегда было правильным. Я зарегистрировал выбранную переменную таблицы, это всегда правильно.
Я не знаю, куда идти с этой точки. Это происходит только в начале действия, а затем работает нормально. У вас есть какие-то намеки или что-то, что я мог бы попробовать. Если вам нужно больше понимания кода, дайте мне знать, и я опубликую больше.