0

好的,从一开始,我有一个 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,每次单击不同的项目时,日志总是正确的。我记录了选定的表变量,它总是正确的。

我不知道从这一点开始。它只发生在活动开始时,然后它工作正常。你有什么提示或什么,我可以试试。如果您需要更深入地了解代码,请告诉我,我会发布更多信息。

4

0 回答 0