刚入门学android,试着做了一个音乐播放器,目前想在歌曲列表界面的item上增加一个小图标,用来标识当前音乐是否正在播放(很多播放器都有这个功能),歌曲列表的list是通过继承BaseAdapter实现的, 现在遇到的问题是从播放界面返回到列表界面时,小图标不会刷新.
请教各位大侠有啥好的方法将正在播放的音乐的索引值传递到列表的activity这边来?同时如何去重绘播放列表的listview?
谢谢!

解决方案 »

  1.   

    1,使用startActivityForResult来启动播放界面,这样退回到列表界面的时候,通过onActivityResult来刷新listView2,使用broadcastreceiver来通知更新界面3,在歌曲列表的activity中的onResume方法做刷新操作,每次调用onResume都会刷新listview了4,设置listener来监听其他界面对音乐控制的操作,一旦收到监听,就更新listview
      

  2.   

    更新listView 即更新adapter喽!  在onresume中给adapter重设值,然后Adapter.notifyDataSetChanged();更新adapter ,可否?
      

  3.   

    既然用到的是ListView,那么继承BaseAdapter是最经常用到,个人也是感觉最好用的,所以对于刷新的话,本身Adapter就有一个刷新的方法:
    adapter.notifyDataSetChanged();//刷新适配器;
    所以你要是想刷新,把上面的代码写在合适的地方就ok了
      

  4.   


    我使用了broadcast来通知更新界面,可以达到更新小图标的问题,但还有个问题是:
    从播放界面返回到列表时,每次都是先将歌曲名称等这些list item信息显示完全后,才看到那个小图标从之前的位置跳转到最新的位置显示,有什么办法能让图标跟随list信息一起刷新呢? 下面是我每一个listitem的布局代码,是不是这有什么问题?<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/plst_item"
        android:layout_width="fill_parent"
        android:layout_height="@dimen/listWidth">
        <ImageView
            android:id="@+id/img_default_album"
            android:layout_width="@dimen/imgBtnAlbumWidth"
            android:layout_height="@dimen/imgBtnAlbumWidth"
            android:layout_alignParentLeft="true"
            android:layout_centerInParent="true"
            android:src="@drawable/def_album"
            android:padding="@dimen/imgPadding"/> <ImageView 
            android:id="@+id/img_playing_icon"
            android:layout_width="@dimen/playingIconWidth"
            android:layout_height="@dimen/playingIconWidth"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:background="@drawable/playing_icon"
            android:visibility="invisible"/>    
        
        <TextView 
            android:id="@+id/txt_song_name"
            android:singleLine="true"
            android:layout_width="match_parent"
            android:layout_height="@dimen/doubleItemWidth"
            android:layout_toRightOf="@id/img_default_album"
            android:layout_toLeftOf="@id/img_playing_icon"
            android:textSize="@dimen/fontSizeSongName"
    android:gravity="center_vertical"
    android:ellipsize="marquee"
    android:padding="@dimen/textPadding"
            android:text="song namesong namesong namesong namesong name"/>
            <TextView
            android:id="@+id/txt_artist_name"
            android:layout_width="match_parent"
            android:layout_height="@dimen/doubleItemWidth"
            android:layout_below="@id/txt_song_name"
            android:layout_toLeftOf="@id/img_playing_icon"
            android:layout_toRightOf="@id/img_default_album"
            android:gravity="center_vertical"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:padding="@dimen/textPadding"   
            android:text="artist namehfgdfgartist namehfgdfg123424124" />
        
        
    </RelativeLayout>
      

  5.   

    一般不会出现图标和其他信息分开来更新这种情况,你用adapter.notifyDataSetChanged()这样应该不会有这个问题,要么就是你在onResume方法里边又做了什么事情
      

  6.   


    我将onResume方法做的操作都删掉了还这样,是不是我刷新这个图标的地方有问题呢?我是写在getView函数里的
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    convertView  = LayoutInflater.from(musicContext).inflate(R.layout.plstitem, null);
    musicCursor.moveToPosition(position);
    TextView txtSongName = (TextView)convertView.findViewById(R.id.txt_song_name);
    TextView txtArtistName = (TextView)convertView.findViewById(R.id.txt_artist_name);
    ImageView imgAlbum = (ImageView)convertView.findViewById(R.id.img_default_album);
    ImageView imgPlayingIcon = (ImageView)convertView.findViewById(R.id.img_playing_icon);

    txtSongName.setText(musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));
    //txtSongName.setText(musicCursor.getString(0));
    txtArtistName.setText(musicCursor.getString(2));


    imgAlbum.setImageResource(R.drawable.def_album);
    imgPlayingIcon.setImageResource(R.drawable.playing_icon);
    if(playingId == position){
    imgPlayingIcon.setVisibility(View.VISIBLE); //显示正在播放的图标
    }
    return convertView;
    }
      

  7.   

    乍一看没啥问题,不过你的getView效率较低,建议改成:
    if (convertView == null) {
    convertView = LayoutInflater.from(musicContext).inflate(R.layout.plstitem, null);
    }
    只有convertView为空的时候才会做解析操作,不然每次解析很费时的,不确定是不是这点有影响,你试下
      

  8.   


    找到原因了,是因为我在onPause方法中将broadcastReceiver给取消注册了,因为之前看关于broadcast方面的知识时,都说要在onPause方法中取消注册,在onResume中重新注册,我现在将取消注册移到Destroy方法中去了,请问我这样做是否可行?
      

  9.   

    当然可行了,这个是依你的应用来决定的,并不是一概而论非要onPause,onResume