好的,从一开始,我有一个 RecyclerView,我想在其中更改条目的颜色,如果它们被点击的话。
如果选择了 View,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 中设置的 Activity 中的变量
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 中的一个lateinit
private lateinit var productViewModel: ProductViewModel
在 OnCreate 我设置了 ViewModel
productViewModel =
ViewModelProviders.of(this).get(ProductViewModel::class.java)
通用适配器调用
private fun observerTable() {
productViewModel.getAllTables().observe(this, Observer<List<Table>> { it ->
adapterNav.setItems(it as MutableList<Any>)
})
}
表道
@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
}
产品视图模型
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,每次单击不同的项目时,日志总是正确的。我记录了选定的表变量,它总是正确的。
我不知道从这一点开始。它只发生在活动开始时,然后它工作正常。你有什么提示或什么,我可以试试。如果您需要更深入地了解代码,请告诉我,我会发布更多信息。