【发布时间】:2013-07-25 06:53:30
【问题描述】:
我有一个列表视图,每行三个图标。如果我按下一个图标(播放),该图标需要将背景更改为另一个(停止)。然后如果我点击不同行的同一个图标,之前改变的图标需要切换到上一个背景(停止播放),新点击的图标需要改变背景到第二个状态(播放停止) .
这是我正在使用的代码,但它似乎无法正常工作。它会更改单击的图标,但如果我单击新行中的相同图标,它不会更改先前单击的行中的图标。
来自适配器:
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();
}
}
【问题讨论】:
-
您应该在适配器的
getView()方法中处理点击和后续更改。 -
@vikram 你能给我一个答案的例子吗?
-
你从哪里得到你的位置和旧位置变量——可能它们有问题。顺便说一句: listView.getChildAt(position) 方法计算可见子项的数量。不是适配器中使用的数字。因此,正如 vikrma 建议的那样,您可能应该更新您的支持模型,然后告诉 ListAdapter Data 发生了变化——这是一种更简单的方法。
-
@SimonMeyer 是的,但我该怎么做?
标签: android android-listview android-adapter android-adapterview