2017-03-06 30 views
2

我想要更改RecyclerView中的ImageView的圖像。在ImageView中更改Image中的RecyclerView

例如:

我有一個RecyclerView 30項,並且當我在物品上點擊在位置1中的項目從播放暫停改變圖像,然後當我向下滾動到位置15和我點擊在播放按鈕上,先前選擇的按鈕(項目1)應該將圖像改回播放,並且項目15圖像應該改變爲暫停。我在onbindViewHolder裏實現了onClicklistener。但它正在改變錯誤的項目中的圖像。 請幫我

if (mediaPlayer != null) { 
    mediaPlayer.reset(); 
    mediaPlayer.stop(); 
    LinearLayout view = (LinearLayout) recyclerView.getChildAt(pos); 
    ImageView button = (ImageView) view.findViewById(R.id.playbutton); 
    button.setImageResource(R.drawable.ic_play_arrow_black_24dp); 
} 




    playbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean isPlaying = sharedPreferences.getBoolean(ConstantValue.ISPLAYING, false); 
       RecordingDetail recordingDetail = list.get(getAdapterPosition()); 
       if (!isPlaying) { 
        SharedPreferences.Editor editor = sharedPreferences.edit(); 
        editor.putBoolean(ConstantValue.ISPLAYING, true); 
        editor.putInt(ConstantValue.CURRENTINDEX, getAdapterPosition()); 
        editor.commit(); 
        playbutton.setImageResource(R.drawable.ic_pause_black_24dp); 
        mediaPlayerControl.Play(recordingDetail.path, getAdapterPosition(), progressBar); 
       } 

這裏的播放按鈕是我想改變,mediaPlayerControl是接口

+0

請發表您的代碼 –

回答

3

您可以使用全局實地跟蹤選定的位置,然後檢查當前視圖圖片視圖選在onBindViewHolder之內。另外,我強烈建議您在ViewHolder內部指定onClickListener

  1. 聲明一個全局變量:

    private int selectedPosition = -1; 
    
  2. 然後設置選擇的位置在onClick並調用notifyDatasetChanged

    @Override 
    public void onClick(View view) { 
        selectedPosition = getAdapterPosition();  
    
        if (mediaPlayer != null) { 
         mediaPlayer.reset(); 
         mediaPlayer.stop(); 
        } 
    
        RecordingDetail recordingDetail = list.get(selectedPosition);    
    
        SharedPreferences.Editor editor = sharedPreferences.edit(); 
        editor.putBoolean(ConstantValue.ISPLAYING, true); 
        editor.putInt(ConstantValue.CURRENTINDEX, selectedPosition); 
        editor.commit(); 
    
        mediaPlayerControl.Play(recordingDetail.path, selectedPosition, progressBar); 
    
        notifyDatasetChanged(); 
    } 
    
  3. 最後,在你的onBindViewHodler檢查所選位置並設置合適的圖像:

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
        LinearLayout view = holder.linearLayout; 
        ImageView button = (ImageView) view.findViewById(R.id.playbutton); 
    
        if (position == selectedPosition) { 
         button.setImageResource(R.drawable.ic_pause_black_24dp); 
        } else { 
         button.setImageResource(R.drawable.ic_play_arrow_black_24dp); 
        } 
    } 
    

EDIT

作爲@shalafi表明,不應該參考保持到RecyclerView適配器內部的particlar視圖,bacause視圖被再循環(再利用)。

+1

好的答案,也許補充說明,爲什麼你不能保持對視圖的引用是因爲視圖正在被回收(因爲名稱RecyclerView暗示) – shalafi

+0

檢查我的問題我有更新 –

+0

請檢查編輯 –