【问题标题】:Listview's row item imageview change background androidListview的行项imageview改变背景android
【发布时间】: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


【解决方案1】:

here 与您的问题相同。背景颜色有变化,可以用setBackground()替换;

【讨论】:

    【解决方案2】:

    只需在您使用列表适配器的任何位置保存活动位置 - 然后向您的 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();
    }
    

    您也不必如此频繁地设置媒体播放器侦听器 - 在 onCompletion 中您可以简单地调用:

    activePostion=-1;
    adapter.notifyDataSetChanged();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多