簡體   English   中英

單擊警報生成器 Android 中的項目時更改/更新回收站查看項目

[英]Change/Update Recycler View Item On Click of Item In Alert Builder Android

我想實現一種排序/過濾系統,其中:

  • 用戶單擊 AlertBuilder,他會看到“按名稱排序”和“按日期排序”。
  • 點擊其中任何一個,recyclerview 應該被更新。

我嘗試了什么:

音樂數據庫

我在哪里獲取所有歌曲並根據用戶選擇進行排序。 (我正在使用 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)
    }
 }
}

我也試過打電話

  • 當 sortOption 的值更改時,來自 MusicDatabase 的allSongsAdapter.notifyDataSetChanged()

例如

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM