ListView播放按钮

时间:2014-05-08 19:49:31

标签: android listview android-listview android-mediaplayer android-adapter

这可能已经被问过很多次但是我似乎无法得到实际答案。我有一个适配器,它从API获取数据并将其转换为列表视图。该行中有自己的播放按钮。单击行内的播放按钮时,应将按钮更改为暂停按钮。当我点击不同行的播放按钮时,单击的最后一个按钮应该返回播放按钮。我知道它是按钮上的setimageresource但我似乎无法跟踪我点击的最后一个按钮。这是我的代码:

这是适配器和

的一部分
 @Override
            public View getView(final int pos, View ConvertView, ViewGroup parent) {

                final MyViewHolder holder;

            if (ConvertView == null){
                ConvertView = layoutinflater.inflate(R.layout.row, parent, false);
                holder = new MyViewHolder();        
                holder.plays = (ImageButton) ConvertView.findViewById(R.id.plays);
                holder.plays.setFocusable(false);
                play = playdata.get(pos);
                holder.posturl= play.getposturl();
                mStartPlaying = true;
                player = new MediaPlayer();
//              player.setOnCompletionListener(onCompletion);
//              player.setOnErrorListener(onError);

                holder.plays.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {

                        String url = holder.posturl;


                        if (!mStartPlaying){
                                holder.plays.setImageResource(R.drawable.ic_action_stop);
                                startPlaying(url);
                                mStartPlaying = true;

                            } else{
                                holder.plays.setImageResource(R.drawable.ic_action_play);
                                player.stop();
                                mStartPlaying = false;
                            }

                    }

                    private void startPlaying(String url) {
                        // TODO Auto-generated method stub

                        try {

                            player.reset();
                            player.setDataSource(url);
                            // mPlayer.setDataSource(mFileName);
                            player.prepareAsync();
                            player.setOnPreparedListener(new OnPreparedListener() {

                                @Override
                                public void onPrepared(MediaPlayer mp) {

                                    player.start();


                                        }
                                      });


                        } catch (IOException e) {
                            Log.e("preparefailed", "prepare() failed");
                        }

                    }
                });

                if (!player.isPlaying()){
                    holder.plays.setImageResource(R.drawable.ic_action_play);
                }
                ConvertView.setTag(holder);
                ConvertView.setOnClickListener(new OnClickListener() {
                    public void onClick(View v){
                        Log.d("hi", "hi from "+ pos);
                    }
                });
            }
            else{
                holder = (MyViewHolder)ConvertView.getTag();
            }



            play = playdata.get(pos);
            holder.play = play;

            return ConvertView;



        }

这是我的主要活动:

mLastClickedPosition = -1;
this.PlayList.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick (AdapterView<?> parent, View view, int position, long id) {



        if(mLastClickedPosition != -1){
              // do something to pause the item in your list at this position
        }

        // next, update mLastClickedPosition
        mLastClickedPosition = position;


        if(position==0){
              ImageView imageView = (ImageView) view.findViewById(R.id.plays);
              imageView.setImageResource(R.drawable.ic_action_stop);
        }

        // play audio


    }

});

媒体播放器在适配器中初始化,我不确定如何在主活动中初始化它。任何帮助表示赞赏!先谢谢!

2 个答案:

答案 0 :(得分:1)

如果ListView中的每一行都知道它所处的状态(butten),您可以使用侦听器或ListView控制LocalBroadcastManager中的每一行。试试this。这是一个ListView骨架,开始在OOP中思考,每一行真正成为一个可以知道它处于什么状态的对象。 ListView抽象示例,使您更容易理解/将java代码视为对象。

从上面的例子中,假设创建的每一行(EventItem)都是LocalBroadcastManager的监听器或寄存器。然后,很容易解决每一行。与每一行交谈并要求它停止让按钮处于暂停状态,或任何

...我正在更新此答案,因为上面的链接不起作用。这是gethub项目的新链接

listview-with-multiple-layouts

答案 1 :(得分:0)

您应该遵循Erik的建议,并将处理委托给每一行。

顺便说一句,问题可能是因为你有两个听众?您正在维持主要活动中的状态,甚至可能不会被调用。如果没有发生这种情况,您可能需要将维护状态移动到列表侦听器(保存最后一个位置)。

但是,请遵循Erik的建议,这应该可以帮助您轻松调试和维护。

祝你好运。