Переключить кнопку ImageView внутри пользовательского списка

У меня есть список мелодий звонка с воспроизведением изображения в каждой строке для каждой мелодии звонка.

Это взгляд на это ..

Это точка зрения

Теперь очевидно, что когда пользователь нажимает кнопку воспроизведения, она должна переключаться на кнопку паузы ... Я реализовал это, и пока все хорошо:

Интерфейс (в адаптере)

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

Теперь у меня проблема:

Я не знаю, как отслеживать текущую воспроизводимую строку, я имею в виду, что если пользователь хочет воспроизвести песню из другой строки, сначала мне нужно изменить переключатель текущей паузы для воспроизведения, а затем воспроизвести новую.

Можете ли вы мне помочь с этим, пожалуйста !?


person S.R    schedule 04.03.2017    source источник


Ответы (3)


Покопавшись, я нашел два ответа ..

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();
}
person S.R    schedule 15.04.2017

Вы можете сделать это сначала, объявив глобальную переменную

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

Замените приведенный выше код кодом в своей деятельности.

person Kiran Benny Joseph    schedule 04.03.2017

Вы можете содержать переменную «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.
}
person Michael Vescovo    schedule 04.03.2017
comment
Это письменный ответ. - person Paresh P.; 04.03.2017
comment
Я обновил свой вопрос .. Не могли бы вы подробнее объяснить, какие изменения мне следует внести в метод воспроизведения и паузы (как их разделить). - person S.R; 04.03.2017
comment
Я имел в виду изменения в моем исходном методе playPauseOnClick .. о состоянии и так далее .. - person S.R; 04.03.2017
comment
Хорошо, как насчет этого? Теперь это проясняет ситуацию? Возможно, это не совсем правильно для вашего кода, но видите ли вы, как это сделать сейчас? - person Michael Vescovo; 04.03.2017
comment
Я понимаю, как работает ваше решение, но ничего не складывается, но я работаю над этим .. Сообщаю вам, спасибо - person S.R; 04.03.2017