[英]Change/Update Recycler View Item On Click of Item In Alert Builder Android
我想實現一種排序/過濾系統,其中:
我嘗試了什么:
音樂數據庫
我在哪里獲取所有歌曲並根據用戶選擇進行排序。 (我正在使用 dataStore 來保存用戶首選項)
fun getSongs(): List<Songs> {
val preferenceStorageImpl = PreferenceStorageImpl(context)
preferenceStorageImpl.sortOrder().asLiveData().observeForever(Observer {
if (it == "name"){
sortMusic = "${MediaStore.Audio.Media.DISPLAY_NAME} ASC"
}
else{
sortMusic = "${MediaStore.Audio.Media.DATE_ADDED} DESC"
}
})
//Get songs from provider
context.contentResolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
sortMusic //Sort in alphabetical or date order based on what was selected (Default - alphabetical).
).use
AllSongsAdapter
private val diffCallback = object : DiffUtil.ItemCallback<Songs>() {
override fun areItemsTheSame(oldItem: Songs, newItem: Songs): Boolean { return oldItem.mediaId == newItem.mediaId
}
override fun areContentsTheSame(oldItem: Songs, newItem: Songs): Boolean {
return oldItem.hashCode() == newItem.hashCode()
}
}
var songs: List<Songs>
get() = differ.currentList
set(value) = differ.submitList(value)
.......//onbindviewholder
override fun onBindViewHolder(holder: AllSongsViewHolder, position: Int)
{
val song = songs[position]
with(holder) {
with(songs[position]) {
.......
}}
歌曲片段
//Observe and show all songs
mainViewModel.mediaItems.observe(viewLifecycleOwner){ result ->
when(result.status){
Status.SUCCESS -> {
result.data?.let { songs ->
allSongsAdapter.songs = songs
allSongs = songs
}
}
Status.ERROR -> Unit
Status.LOADING -> Unit
}
}
//AlertBuilder, On click of sort by name or date
private fun sortByName(){
val sortOptionName = "name"
storageViewModel.changeSortOption(sortOptionName)
allSongsAdapter.notifyDataSetChanged()
}
private fun sortByDateAdded(){
val sortOptionDate = "date"
storageViewModel.changeSortOption(sortOptionDate)
allSongsAdapter.notifyDataSetChanged()
}
存儲視圖模型
class StorageViewModel @ViewModelInject constructor(private val
preferenceStorage: PreferenceStorage) : ViewModel() {
val sortOrder = preferenceStorage.sortOrder().asLiveData()
fun changeSortOption(order: String) {
viewModelScope.launch {
preferenceStorage.setSortOrder(order)
}
}
}
我也試過打電話
例如
if (it == "name"){
sortMusic = "${MediaStore.Audio.Media.DISPLAY_NAME} ASC"
allSongsAdapter.notifyDataSetChanged()
}
沒用。
當我關閉應用程序並打開時,音樂列表排序良好(根據最后選擇的排序選項)
但它不是實時更新的(用戶點擊按名稱或日期排序的那一刻)
您可以在每次要更新時重新創建適配器,或者如果您可以使用diffutil有效地比較重新創建整個回收器視圖或使用invalidate()
回收器視圖,這將重新初始化它
在 kotlin 中重新創建適配器,如下所示:
private fun createAdapter() {
val mLinearLayoutManager = GridLayoutManager(context, 2)
mRecyclerViewMediaList.layoutManager = mLinearLayoutManager
itemListSaved = getListFiles(
File(
Environment.getExternalStorageDirectory()
.toString() + DIRECTORY_TO_SAVE_MEDIA_NOW
)
)!!
mRecyclerViewMediaList.adapter = mRecyclerViewMediaAdapte
}
在您調用 notifydatasetchanged() 的地方調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.