How to automatically change focus to the next list item

I am writing an Audio Player application in which I have to automatically change focus to the next element of the list, when a new song starts, I can play the next song, but I can not select this song.

<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 to listen for clicks:

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

Method used to automatically switch to the next song

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

Adapter Class:

 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; } } 
+5
source share
4 answers

This can be done using the following steps:

Code snippet:

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

The adapter class will look like this:

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

Hope this helps ツ

+2
source

To do this, you need to send a value to the adapter, which will notify the adapter which position of the list will be set. Only after that you can do it. And again you need to install the adapter.

0
source

Your code seems beautiful, just call notifyDataSetChange in your adapter to tell it that the data in the array has changed and needs to be reloaded:

If you need to get items in the previous position, just do:

 if (position != 0) { positionGlobal = position - 1; strNURL = audiosArrayList.get(positionGlobal).getUrl().toString(); strNTITLE = audiosArrayList.get(positionGlobal).getTitle().toString(); } 
0
source

try setItemChecked , focus your list view. without calling nofifydatachanges

 listview.setItemChecked(position, true); 

and you also try

 listview.setSelection(position); 
0
source

Source: https://habr.com/ru/post/1212171/


All Articles