在自定义列表视图

时间:2017-03-04 09:03:08

标签: android eclipse listview android-studio adapter

我有一个铃声列表视图,每个铃声都有一个播放图像视图。

这是它的观点..

This is the view of it

现在显然当用户点击播放按钮时,它应该切换到暂停按钮..我已经实现了这一点,到目前为止一切都很好:

接口(在适配器中)

       public interface PlayPauseClick {
         void playPauseOnClick(int position);
        }
   private PlayPauseClick callback;
   public void setPlayPauseClickListener(PlayPauseClick listener) {
        this.callback = listener;
    }

适配器(在getView中)

    Product product = (Product) mDataItems.get(position);
    holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
    holder.playPause.setImageResource(product.getPlayPauseId());
    holder.playPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              if (callback != null) {
                  callback.playPauseOnClick(position);
              }      
        }
    });

活动

    @Override
public void playPauseOnClick(int position) {
    final Product product = productList.get(position);
                if (product.paused) {
                    product.setPlayPauseId(R.drawable.ic_pause);
                    product.paused=false;
                }else {
                    product.setPlayPauseId(R.drawable.ic_play);
                    product.paused = true;
                }
                adapter.notifyDataSetChanged();     
    };

现在我遇到了一个问题:

我不知道如何跟踪当前播放的行,我的意思是如果用户想要播放另一行的歌曲,首先我必须更改当前的暂停切换才能播放,然后播放新的。

你能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

经过一番挖掘后,我找到了两个答案..

1:我们可以存储在适配器中播放的当前歌曲的索引。

因此,当我们点击其他按钮时,我们只需要打开暂停。

在适配器中:

   int currentPosition = -1;
...
if (callback != null) {
  callback.playPauseOnClick(position);
  if (currentPosition == -1){
       currentPosition = position;
  } else if (currentPosition == position){
       currentPosition = -1;
  } else if (currentPosition != -1 && currentPosition != position){
       callback.playPauseOnClick(currentPosition);
       currentPosition = position;
  }
} 

2:为每个列表视图数据项

设置资源

内部回调或任何地方都可以获得listview数据:

@Override
public void playPauseOnClick(int position) {
    final Product product = productList.get(position);
    if (product.paused) {
        for(int i=0;i< productList.size();i++)
        {
            movieList.get(i).setPlayPauseId(R.drawable.ic_play);
            movieList.get(i).paused = true;
        }
        product.setPlayPauseId(R.drawable.ic_pause);
        product.paused=false;
    }else {
        product.setPlayPauseId(R.drawable.ic_play);
        product.paused = true;
    }
    adapter.notifyDataSetChanged();
}

答案 1 :(得分:0)

您可以保存一个变量“mCurrentPosition”来保存当前正在播放的曲目。

然后创建两个单独的方法,一个用于播放,一个用于暂停。只需暂停当前曲目并播放单击的曲目即可。

请记住在播放新曲目时也设置当前位置。

这样的事情:

@Override
public void onClick(View v) {
      if (callback != null) {
          callback.pause(mCurrentPosition);
          mCurrentPosition = position;
          callback.play(position);
      }      
}

您可能需要稍微调整一下,因为我不知道您是如何设置“回调”或“位置”的来源。我假设“getAdapterPosition()”之类的东西。但希望你可以通过这个例子看到如何做到这一点。如果没有,请发表评论。

修改以回应更新的问题:

对于界面,请执行以下操作:

public interface PlayPauseClick {
    void pause(int position);
    void play(int position);
}

<强> EDIT2

@Override
void pause(int position) {
    if(position != null) {
        Product product = productList.get(position);
        product.setPlayPauseId(R.drawable.ic_play);
        product.paused = true;
        adapter.notifyDataSetChanged();
    }
}

@Override
void play(int position) {
    // Homework exercise.
}

答案 2 :(得分:0)

你可以这样做 首先,声明一个全局变量

int lastposition=null;

然后

 @Override
public void playPauseOnClick(int position) {
    final Product product = productList.get(position);
                if(lastposition!=null)
                {
                     Product previous = productList.get(lastposition);
                     previous.setPlayPauseId(R.drawable.ic_pause);
                     previous.paused=false;
                     lastposition=position;
                } else lastposition=position;
                if (product.paused) {
                    //new loadSingleView().execute(product.image_url);
                    //Log.d(LOG, product.image_url);
                    product.setPlayPauseId(R.drawable.ic_pause);
                    product.paused=false;
                }else {
                    product.setPlayPauseId(R.drawable.ic_play);
                    product.paused = true;
                }
                adapter.notifyDataSetChanged();     
    };

将上述代码替换为活动中的代码