0

我有一個列表視圖,每行有三個圖標。如果我按下圖標(播放),圖標需要將背景更改爲另一個(停止)。然後,如果我點擊不同行中的同一個圖標,之前更改的圖標需要切換到上一個背景(停止播放),並且新點擊的圖標需要將背景更改爲第二個狀態(播放停止) 。列表視圖的行項目imageview更改背景android

這是我使用的代碼,但似乎它不能正常工作。它改變了被點擊的一個,但是如果我點擊新行中的相同圖標,它不會改變先前點擊的行中的圖標。

從適配器:

playSong.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mediaPlayer.isPlaying() && mediaPlayer != null) { 
        mediaPlayer.release(); 
        if (oldPosition != -1) { 
         ((AlbumDetails) activity).changePicToPlay(oldPosition, 
           playSong); 
        } 
        mediaPlayer = new MediaPlayer(); 
       } else { 
        oldPosition = position; 
        try { 
         mediaPlayer.setDataSource(data.get(position) 
           .getSONG_MP3()); 
         final ProgressDialog bufferingDialog = new ProgressDialog(
           activity); 

         bufferingDialog.setMessage(activity 
           .getString(R.string.buffering)); 
         bufferingDialog.show(); 
         mediaPlayer.prepareAsync(); 
         mediaPlayer 
           .setOnPreparedListener(new OnPreparedListener() { 

            @Override 
            public void onPrepared(MediaPlayer arg0) { 
             bufferingDialog.dismiss(); 
             mediaPlayer.start(); 

            } 
           }); 
         postData(1, position); 
         mediaPlayer 
           .setOnCompletionListener(new OnCompletionListener() { 

            @Override 
            public void onCompletion(MediaPlayer arg0) { 
             playSong.setBackgroundResource(R.drawable.play_nr); 
             mediaPlayer.release(); 
            } 
           }); 
         ((AlbumDetails) activity).changePicToStop(oldPosition); 
        } catch (IllegalArgumentException e) { 
         e.printStackTrace(); 
        } catch (SecurityException e) { 
         e.printStackTrace(); 
        } catch (IllegalStateException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 

從我的活動:

public void changePicToStop(int position) { 
     View vi = listView.getChildAt(position); 
     if (vi != null) { 
      ImageView playSong = (ImageView) vi 
        .findViewById(R.id.songs_item_play); 
      playSong.setBackgroundResource(R.drawable.stop); 
     } 
    } 

    public void changePicToPlay(int position, ImageView image) { 
     View vi = listView.getChildAt(position); 
     if (vi != null) { 
      image.setBackgroundResource(R.drawable.play_nr); 
      listView.refreshDrawableState(); 
     } 
    } 
+0

您應該處理適配器'getView()'方法中的點擊和後續更改。 – Vikram

+0

@vikram你能給我一個答案的例子嗎? –

+0

你從哪裏得到你的位置和舊位置變量 - 可能是他們有問題。 Btw:listView.getChildAt(position)方法計算可見子項的數量。不是適配器中使用的數字。因此,vikrma建議您應該更新您的支持模型,然後告訴ListAdapter數據已更改 - 這是一種更簡單的方法。 –

回答

1

只需保存的活動位置徘徊無論你用你的listadapter - 再加入一些切換到您的getView()方法,如:

if (position==activePosition) 
{ 
    playSong.setBackgroundResource(R.drawable.play_nr); 
} 
else 
{ 
    playSong.setBackgroundResource(R.drawable.stop); 
} 

與您的

public void changePicToPlay(int position) { 
    activePosition = position; 
    adapter.notifyDataSetChanged(); 
} 

你沒有設置mediaplayers聽衆經常然後過 - 在onCompletion你可以直接電話諮詢:

activePostion=-1; 
adapter.notifyDataSetChanged(); 
+0

仍doens't變化 –

+0

奇怪 - 你是否正確處理convertView? –

1

here是你的問題相同的解決方案。有改變backgroundColor,你可以用setBackground()替換它;