2017-02-01 6 views
1

Привет друзья У меня есть список, в котором у меня есть песни из службы в списке, когда-либо в строке которого есть кнопка, которая является (Play/Pause). У меня возникла проблема с On On of songs, потому что, если моя песня заканчивается, я хочу выполнить щелчок на кнопке «Следующая строка», но она выполняет щелчок по кнопке 4-й строки. но если я увеличиваю высоту строки списка, чем второй. Я также пытаюсь использовать метод setTag() и getTag(), но не повезло. Пожалуйста помоги.Получение неправильного представления из представления

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     final Planet planet = (Planet) planetList.get(position); 


     viewHolder = null; 

     // Create a new row view 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false); 

      viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01); 

      } 
      convertView.setTag(viewHolder); 

     } else { 

      viewHolder = (ViewHolder) convertView.getTag(); 

     } 

    viewHolder.playbutton.setTag(position_tag);  //position_tag is a int variable 


viewHolder.playbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       final int positiont = mainListView.getPositionForView(parentRow); 

        String name = planet.getSong_url(); 

        selectedPosition = positiont; 
        position_tag=selectedPosition; 
        position_tag=position_tag+1; // if i use this it gives error on complete button perform click 

     position_tag=1; // if i use this then it plays second song perform second button click 

     playsong(name);});} 



mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 

       int hell = position_tag; 
       Log.d("position_on",hell+""); //aFTER 1st SONG COMPLETE these value prints "4" but i need next one 

        viewHolder.checkBox.findViewById(R.id.CheckBox01).findViewWithTag(position_tag).performClick(); 

       } 
     }); 
+1

Почему вы получаете позицию из mainListView.getPositionForView(). Вы уже пометили позицию в playbutton. то вы можете получить позицию с кнопки воспроизведения. затем, получите название песни из элемента списка, в зависимости от нажатия кнопки. – Noorul

+0

Я также пробую эту окончательную позицию int = (целое число) v.getTag(); вместо getPositionForView(); но у меня есть так много вещей на кнопке воспроизведения, поэтому мне нужно выполнить щелчок на кнопке, по завершении песни, но @ahmed, почему этот код работает для Android-Tv beacuse. Строки списка ТВ больше по высоте, а мобильные - с небольшими рядами высоты. Есть идеи?? –

+0

И еще одно: Mediaplayer должен работать как сервис. в противном случае проигрыватель перестанет играть, когда вы выйдете из приложения. – Noorul

ответ

1

В соответствии с вашим кодом, вы должны сделать, как показано ниже,

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    final Planet planet = (Planet) planetList.get(position); 


    viewHolder = null; 

    // Create a new row view 
    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false); 

     viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01); 
convertView.setTag(viewHolder); 



    } else { 

     viewHolder = (ViewHolder) convertView.getTag(); 

    } 

viewHolder.playbutton.setTag(position);  //position_tag is a int variable 


viewHolder.playbutton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      final int positiont = Integer.parseInt(v.getTag().toString()); 
      PlanetList planet=planetList.get(positiont) 
       String name = planet.getSong_url(); 

       selectedPosition = positiont; 
       position_tag=positiont; 
    playsong(name);});} 



mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
     position_tag=(position_tag+1) 
    final Planet planet = (Planet) planetList.get(position_tag);//UPDATED 
    mp.setDataSource(planet.getSongUrl()); 
    mp.start(); 

      } 
    }); 

UPDATE

создают статическое поле с именем position_tag присваивается первое место по нажатию кнопки, когда медиаплеера завершена, вы можете добавить +1 с помощью position_tag и проверить, что позиция все еще существует в элементе списка. затем добавьте его в медиаплеер. установите URL-адрес для MP, а затем снова запустите медиаплеер с той же ссылкой на заполненном слушателем медиаплеер.

ПРИМЕЧАНИЕ:: вы создаете объект MediaPlayer в классе адаптера, когда класс адаптера уничтожается и воссоздается, воссозданный объект медиапланера не будет работать с существующим файлом воспроизведения.

+0

Я пробую эти два, но результат такой же. На носителях моя позиция автоматически увеличивается, если ее 1 затем увеличивают и выполняют щелчок по кнопке 5-й строки. –

+0

Итак, что вы хотите сделать, после завершения первой песни, он автоматически сыграет следующую песню.right? Ex: если первая песня будет следующей, будет ли вторая песня играть правильно? – Noorul

+0

Да, я хочу этих братьев.и моя кнопка второго ряда меняется с режима воспроизведения на паузу, и функция функции кнопки вызова напоминает выделение выделения. –

0

В вашем viewHolder.playbutton.setOnClickListener вы можете получить позицию щелкнули элемента с помощью метода, viewholder в getAdapterPosition(). В onClickListener вы можете сохранить эту позицию, а в onCompletionListener просто увеличить эту позицию на 1 и воспроизвести песню из следующей строки.

+0

Да, я делаю то же, что и вы, сэр, но я не знаю, почему в полном методе мое значение, которое я увеличиваю, автоматически увеличивается с помощью 4 чисел. –

1

Пожалуйста, измените одну строку в getView, она должна решить вашу проблему.

final Planet planet = (Planet)this.getItem(position); 

Поскольку Если щелкнуть ListView пункт его данной позиции от видимого размера элемента списка, а не от всего размера в упорядоченном пути.

Также помещается строка ниже в позицию «если», которую вы используете для установки тега. Потому что вы меняете каждый раз, когда обновляете тег, чтобы показать, что всякая новая позиция заработной платы не является фактической позицией, которая была установлена ​​при первом раздутии списка.

if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false); 

     viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01); 
     convertView.setTag(viewHolder); 
     viewHolder.playbutton.setTag(position);  //position is a int variable  
    } else {  
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
+0

получение этой ошибки @Chetan: java.lang.Integer не может быть отброшен в Planet, Plane - мой класс Pojo. –

+0

@Override public Object getItem (int position) { позиция возврата; } Это мой getItem. –

+0

, если вы используете ArrayAdapter , тогда ist должен предоставить объект Planet, –

Смежные вопросы