2015-01-29 4 views
5

Piszę aplikację Audio Player, w której muszę automatycznie zmienić ostrość na następny element listy po rozpoczęciu nowej piosenki, jestem w stanie odtworzyć następny utwór, ale nie mogę zaznaczyć tej piosenki .Automatyczne ustawianie fokusu na następnym elemencie listy

<ListView 
     android:id="@+id/list_slidermenu"   
     android:layout_height="0dp" 
     android:layout_width="match_parent" 
     android:layout_weight="8"  
     android:layout_gravity="start" 
     android:scrollbars="none" 
     android:fastScrollEnabled="true" 
     android:choiceMode="singleChoice" 
     android:listSelector="@drawable/list_selector" 
     /> 

ListView na click słuchacza:

 listview.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int position, 
       long id) { 
      // TODO Auto-generated method stub       

      positionGlobal = position; 

      strNURL = audiosArrayList.get(positionGlobal).getUrl().toString(); 
      strNTITLE = audiosArrayList.get(positionGlobal).getTitle().toString(); 

      if(mediaPlayer!=null && mediaPlayer.isPlaying()) 
       try { 
        mediaPlayer.stop(); 
        } catch (Exception e) { 

        } 
       play(); 
       textTrack.setText(strNTITLE); 
      } 
     });       
    } 

Metoda z zastosowaniem aby przełączyć się do następnego utworu automatycznie

public void next() { 

    if (positionGlobal == (audiosArrayList.size()-1)) {     
     positionGlobal = 0;    
     strNURL = audiosArrayList.get(positionGlobal).getUrl().toString(); 
     strNTITLE = audiosArrayList.get(positionGlobal).getTitle().toString(); 

     current_position = 0; 
     mediaPlayer.seekTo(current_position); 
     if(mediaPlayer!=null && mediaPlayer.isPlaying()) 
       try { 
        mediaPlayer.stop(); 
        } catch (Exception e) { 
       } 
      play(); 
      textTrack.setText(strNTITLE); 
     } 

    else if(positionGlobal < audiosArrayList.size()) { 

    positionGlobal = positionGlobal+1; 

    strNURL = audiosArrayList.get(positionGlobal).getUrl().toString(); 
    strNTITLE = audiosArrayList.get(positionGlobal).getTitle().toString(); 

    current_position = 0; 
    mediaPlayer.seekTo(current_position); 
    if(mediaPlayer!=null && mediaPlayer.isPlaying()) 
      try { 
       mediaPlayer.stop(); 
       } catch (Exception e) { 
      } 
     play(); 
     textTrack.setText(strNTITLE); 
    } 
} 

klasa adaptera:

public class AudioAdapter extends BaseAdapter { 
    ArrayList<Audio> actorList; 
    LayoutInflater vi; 
    int Resource; 
    ViewHolder holder; 
    Context context; 

    public AudioAdapter(Context context, int resource, ArrayList<Audio> objects) { 
     this.context = context; 
     this.vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.Resource = resource; 
     this.actorList = objects; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return actorList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return actorList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // convert view = design 
     View v = convertView; 
     if (v == null) { 
      holder = new ViewHolder(); 
      v = vi.inflate(Resource, null); 
      holder.tvName = (TextView) v.findViewById(R.id.title); 

      v.setTag(holder); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     }  
      holder.tvName.setText(actorList.get(position).getTitle());  


     return v; 

    } 

    static class ViewHolder { 
     public TextView tvName; 

    } 

} 
+0

użytkowania notifyDataSetchnage api, aby powiadomić ListView chnages – KOTIOS

+0

@diva gdzie muszę używać audioAdapter.notifyDataSetChanged(); ? – Sun

+0

czy możesz wskazać, gdzie przeglądasz listę? – KOTIOS

Odpowiedz

0

W tym celu należy wysłać wartość do adaptera, który powiadomi adapter, że pozycja widoku listowego zostanie ustawiona. Tylko w ten sposób można to zrobić. I znowu trzeba ustawić adapter.

0

Kod wydaje się w porządku, po prostu zadzwoń notifyDataSetChange w karty poinformować go, że dane w tablicy uległ zmianie i musi przeładować go:

Jeśli chcesz, aby elementy z poprzedniej pozycji, po prostu zrobić:

if (position != 0) { 
      positionGlobal = position - 1; 

      strNURL = audiosArrayList.get(positionGlobal).getUrl().toString(); 
      strNTITLE = audiosArrayList.get(positionGlobal).getTitle().toString(); 
} 
+0

gdzie muszę używać audioAdapter.notifyDataSetChanged(); ? – Sun

+0

Po zmianie elementu w audiosArrayList –

2

można to osiągnąć poprzez poniżej listy kroków:

  1. Set wybranego elementu z śledzenie bieżącej selekcji adapter
  2. Wykonaj poz kliknij
  3. Przejdź do wybranej pozycji: smoothScrollToPosition(int position)

fragment kodu:

mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     // First set next position in positionGlobal 

     //highlight ListItem 
     audioAdapter.setSelectedItem(position); 

     // Then perform Click 
     listview.performItemClick(listview, positionGlobal, listview.getItemIdAtPosition(positionGlobal)); 

     // Scroll to selected position 
     listview.smoothScrollToPosition(positionGlobal); 
    } 
}); 

Klasa Adapter będzie wyglądać następująco:

public AudioAdapter(Context context, int resource, ArrayList<Audio> objects) { 
    public void setSelectedItem(int selectedItem) { 
     this.selectedItem = selectedItem; 
     notifyDataSetChange(); 
    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent){ 
      // convert view = design 
      View v = convertView; 
      // Your code 

      // set selected Item 
      if(position == selectedItem) { 
      // you can define your own color of selected item here 
      v.setBackgroundColor(StringUtils.getColorFromResources(R.color.light_blue)); 
     } else { 
      // you can define your own default selector here 
      v.setBackground(StringUtils.getDrawableFromResources(R.drawable.abs__list_selector_holo_light)); 
     } 
    } 
} 

Nadzieja pomaga ツ

0

spróbuj setItemChecked, ustaw ostrość w widoku listy. bez wywołania nofifydatachanges

listview.setItemChecked(position, true); 

a także spróbować

listview.setSelection(position);