0

各行に 3 つのアイコンがあるリストビューがあります。アイコン(再生)を押すと、アイコンは背景を別の(停止)に変更する必要があります。そして、別の行で同じアイコンをクリックすると、前に変更されたアイコンは前の背景に切り替える必要があり (停止して再生)、新しくクリックされたアイコンは背景を 2 番目の状態に変更する必要があります (再生して停止します)。 .

これが私が使用しているコードですが、正しく機能していないようです。クリックしたものは変更されますが、新しい行で同じアイコンをクリックしても、前にクリックした行のアイコンは変更されません。

アダプターから:

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();
        }
    }
4

2 に答える 2

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();
于 2013-07-25T07:48:49.390 に答える
1

ここにあなたの質問に関する同じ解決策があります。backgroundColor の変更があります。setBackground(); で置き換えることができます。

于 2013-07-25T07:52:42.847 に答える