2017-08-30 179 views
-1

這裏是我的代碼切換按鈕更改其狀態

@Override 
public void onBindViewHolder(final RecyclerViewHolder holder, int position) { 
final Songs songs = arrayList.get(position); 

holder.favorite.setChecked(songs.getFavorite()); // this line makes me confusing. 

    holder.favorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
     int r = db.update_favorite(b,songs.getTitle(),songs.getArtist()); 

      compoundButton.setChecked(b); 
     } 
    }); 

} 

這裏的問題是,如果我有這個代碼

holder.favorite.setChecked(songs.getFavorite ());

onBindViewHolder,當我改變切換按鈕的狀態,向下滾動,然後向上滾動,切換按鈕的狀態本身就是改變原來的狀態。爲了說明,當切換按鈕狀態從false變爲true並且用戶向上和向下滾動時,切換按鈕自動變爲原始狀態,其爲假。

如何使切換按鈕保持狀態的變化甚至用戶向下滾動?請幫幫我。

+0

嘗試移除'compoundButton.setChecked(b);',因爲''favorite'已經'setChecked'。 – NamNH

+0

@NNNNH感謝您的回覆。我試過你的答案,但它不起作用。 –

回答

0

這是我的猜測:CompoundButton.OnCheckedChangeListener在你不期待的時間點燃。

想象一下,你有100首歌曲,每首歌曲都不是最喜歡的。您激活與歌曲#5關聯的CompoundButton,這會觸發其OnCheckedChangeListener,並將歌曲#5標記爲數據庫中的收藏。然後向下滾動,直至歌曲#5不在屏幕上。

在某些時候,以前與歌曲#5關聯的ViewHolder將被回收,然後被重新用於顯示另一首歌曲。在那個時候,onBindViewHolder()將被調用。而這將觸發該行:

holder.favorite.setChecked(songs.getFavorite()); 

請記住,這ViewHolder用於與歌曲#5相關聯,所以CompoundButton檢查這條線運行之前。由於新歌是而不是最喜歡的,這一行將更改CompoundButton,以便它沒有選中。

這將觸發onCheckedChangeListener除此之外,聆聽者還沒有被重新分配,因此仍然指的是歌曲#5。由於CompoundButton已從檢查更改爲未選中,因此收聽者會將歌曲#5標記爲而不是是數據庫中的最愛。

然後,聽衆被重新分配,現在指新歌。但在這一點上,損害已經完成。

您可以通過簡單地在onBindViewHolder()開頭添加

holder.favorite.setOnCheckedChangeListener(null); 

解決這個問題。

+0

很好的解釋!感謝那,但是當我試圖添加holder.favorite.setOnCheckedChangeListener(null);在onBindViewHolder()開始時它仍然無法正常工作......我做了一些測試,我試圖刪除這一行holder.favorite.setChecked(歌曲。getFavorite());它似乎是工作,因爲它不會在滾動後更改爲原始狀態,但問題是如何在第一次運行時從數據庫設置切換按鈕? –

+0

@ Mak-MakBasaya我不知道爲什麼它不適合你。我製作了一個小樣本應用程序(https://pastebin.mozilla.org/9031009),它重現了問題,然後通過將偵聽器設置爲空來修復它。 –

+0

是的!最後我的切換按鈕現在可以在你的幫助下工作。我分析了您的示例應用程序,並找出問題所在。我添加了holder.favorite.setOnCheckedChangeListener(null);就像你所建議的,我添加了這首歌曲.setFavorite(b); holder.favorite.setOnCheckedChangeListener(),現在它的作品就像我想要的..非常感謝... –