Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何自动更改下一个列表项的焦点_Android_Android Listview - Fatal编程技术网

Android 如何自动更改下一个列表项的焦点

Android 如何自动更改下一个列表项的焦点,android,android-listview,Android,Android Listview,我正在编写一个音频播放器应用程序,在这个应用程序中,当一首新歌开始播放时,我必须自动将焦点切换到下一个列表项上,我可以播放下一首歌,但无法突出显示该歌曲 <ListView android:id="@+id/list_slidermenu" android:layout_height="0dp" android:layout_width="match_parent" android:layout_weight=

我正在编写一个音频播放器应用程序,在这个应用程序中,当一首新歌开始播放时,我必须自动将焦点切换到下一个列表项上,我可以播放下一首歌,但无法突出显示该歌曲

<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侦听器:

     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);
            }
        });                         
    }
listview.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(适配器视图arg0、视图视图、内部位置、,
长id){
//TODO自动生成的方法存根
位置全局=位置;
strNURL=audiosArrayList.get(positionGlobal.getUrl().toString();
strnttitle=audiosArrayList.get(positionGlobal.getTitle().toString();
if(mediaPlayer!=null&&mediaPlayer.isPlaying())
试一试{
mediaPlayer.stop();
}捕获(例外e){
}
play();
textTrack.setText(strNTITLE);
}
});                         
}
用于自动切换到下一首歌曲的方法

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);
    }
}
public void next(){
如果(positionGlobal==(audiosArrayList.size()-1)){
位置全局=0;
strNURL=audiosArrayList.get(positionGlobal.getUrl().toString();
strnttitle=audiosArrayList.get(positionGlobal.getTitle().toString();
当前位置=0;
mediaPlayer.seekTo(当前位置);
if(mediaPlayer!=null&&mediaPlayer.isPlaying())
试一试{
mediaPlayer.stop();
}捕获(例外e){
}
play();
textTrack.setText(strNTITLE);
} 
else if(positionGlobal
适配器类:

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;

    }

}
公共类AudioAdapter扩展了BaseAdapter{
ArrayList actorList;
拉平机vi;
智力资源;
视窗座;
语境;
公共音频适配器(上下文、int资源、ArrayList对象){
this.context=上下文;
this.vi=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
这个。资源=资源;
this.actorList=对象;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回actorList.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回actorList.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
//转换视图=设计
视图v=转换视图;
如果(v==null){
holder=新的ViewHolder();
v=vi.充气(资源,空);
holder.tvName=(TextView)v.findViewById(R.id.title);
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}       
holder.tvName.setText(actorList.get(position.getTitle());
返回v;
}
静态类视窗夹{
公共文本视图tvName;
}
}

为此,您必须向适配器发送值,该值将通知适配器listview的哪个位置将被设置为值。只有这样,您才能做到这一点。同样,您必须设置适配器。

您的代码似乎很好,只需在适配器中调用
notifyDataSetChange
,通知它阵列中的数据已更改,需要重新加载:

如果您需要在以前的位置获取项目,只需执行以下操作:

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

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

您可以通过以下步骤列表来实现这一点:

  • 设置所选项目,并跟踪适配器中的当前选择
  • 执行项目单击
  • 滚动至所选项目:
  • 代码段:

    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);
        }
    });
    
    适配器类将如下所示:

    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));
            }
         }
     }
    
    公共音频适配器(上下文、int资源、ArrayList对象){
    公共无效设置selectedItem(int selectedItem){
    this.selectedItem=selectedItem;
    notifyDataSetChange();
    }
    @凌驾
    公共视图getView(最终整数位置、视图转换视图、视图组父视图){
    //转换视图=设计
    视图v=转换视图;
    //你的代码
    //设置所选项目
    如果(位置==选择编辑项){
    //您可以在此处定义所选项目的颜色
    v、 setBackgroundColor(StringUtils.getColorFromResources(R.color.light_blue));
    }否则{
    //您可以在此处定义自己的默认选择器
    v、 设置背景(StringUtils.getDrawableFromResources(R.drawable.abs\uu列表\u选择器\u全息灯));
    }
    }
    }
    
    希望能有帮助ツ

    尝试,聚焦列表视图。不调用nofifiydatachanges

    listview.setItemChecked(position, true);
    
    你也可以试试

    listview.setSelection(position);
    

    使用NotifyDataSetchManager api通知listviewchnages@diva我必须在哪里使用audioAdapter.notifyDataSetChanged()?你能指出你在哪里修改listview吗?如果下一首歌当时不可见怎么办?您需要向下滚动才能看到正在播放的歌曲,一旦您这样做,它就会失去焦点。@user3249477那么您会推荐我吗?我必须在哪里使用audioAdapter.notifyDataSetChanged()?更改audiosArrayList中的项目后