Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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
ListView仅在活动重新启动时更新-Android_Android_Multithreading_Listview_Android Adapter - Fatal编程技术网

ListView仅在活动重新启动时更新-Android

ListView仅在活动重新启动时更新-Android,android,multithreading,listview,android-adapter,Android,Multithreading,Listview,Android Adapter,嗨,我在下面提供了我的代码。我有一个主UI线程和一个手动线程。我正在更新线程内的listView,并在适配器和列表视图中使用它来填充。但问题是,一旦活动启动,列表就为空,只有当配置更改时,它才会使用适配器进行更新。有什么问题吗?我的线程仅在oncreate完成后启动?请留下光标部分,因为我得到的所有值都很好。请帮助我的朋友 public class MediaActivity extends Activity { private static final String TAG = null; E

嗨,我在下面提供了我的代码。我有一个主UI线程和一个手动线程。我正在更新线程内的listView,并在适配器和列表视图中使用它来填充。但问题是,一旦活动启动,列表就为空,只有当配置更改时,它才会使用适配器进行更新。有什么问题吗?我的线程仅在oncreate完成后启动?请留下光标部分,因为我得到的所有值都很好。请帮助我的朋友

public class MediaActivity extends Activity {
private static final String TAG = null;
ExpandableListView expList ;
ExpandableListAdapter expListAdapter;
static ArrayAdapter<String> ap;
static List<String> albumHead = new ArrayList<String>();
static HashMap<String, List<String>> albumChild = new HashMap<String, List<String>>();
static Cursor albumCursor;
AlbumThread albumThread;

@Override
protected void onStart() {

    super.onStart();
    albumThread = new AlbumThread();
    albumThread.start();
    Log.d(TAG , "albumThread Started");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_media);

    ListView expList = (ListView)findViewById(R.id.mediaList);

    ap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, albumHead);

    if(!albumHead.isEmpty()){
    expList.setAdapter(ap);
    } else {
        Toast makeToast = Toast.makeText(getApplicationContext(), "albumHead is empty" , Toast.LENGTH_LONG);
        makeToast.show();
    }
}

private static class AlbumThread extends Thread{
    Context appContext = MediaApp.getAppContext();

    List<String> songList = new ArrayList<String>();

    public AlbumThread() {
        super("myThread");

    }
    @Override
    public void run() {
        // Query Media Contents from MediaStore.Audio.Media.EXTERNAL_CONTENT_URI         
        super.run();
        ContentResolver albumResolver = appContext.getContentResolver();
        Uri mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String[] mediaColumns = {
                MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.ALBUM,
                MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DISPLAY_NAME,                                        
            };

        String mediaSort = " " + MediaStore.Audio.Media.ALBUM + " ASC" + "," + MediaStore.Audio.Media.DISPLAY_NAME + " ASC"; 

        albumCursor = albumResolver.query(mediaContentUri, mediaColumns, null, null, mediaSort);


        //Extract values from Cursor
        if(albumCursor.moveToFirst()){
            do{
                int albumIdx = albumCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
                int songIdx = albumCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);


                String albumString = albumCursor.getString(albumIdx);
                String songString = albumCursor.getString(songIdx);


            if(!albumHead.contains(albumString)){
                albumHead.add(albumString); 
                ap.notifyDataSetChanged();
            }
            if(albumHead.contains(albumString)){

                songList.add(songString);
                albumChild.put(albumString, songList);
            } 
            }while (albumCursor.moveToNext());

        }

    }       

}

@Override
protected void onStop() {

    super.onStop();
    albumThread = null;
    Log.d(TAG, "albumThread stopped yapee");
}
公共类MediaActivity扩展活动{
私有静态最终字符串标记=null;
可扩展列表视图解释列表;
可扩展列表适配器;
静态阵列自适应ap;
静态列表albumHead=newArrayList();
静态HashMap albumChild=新HashMap();
静态光标;
相册线程相册线程;
@凌驾
受保护的void onStart(){
super.onStart();
albumThread=新的albumThread();
albumThread.start();
Log.d(标记“AlbumThreadStarted”);
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media);
ListView expList=(ListView)findViewById(R.id.mediaList);
ap=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,albumHead);
如果(!albumHead.isEmpty()){
expList.setAdapter(ap);
}否则{
Toast makeToast=Toast.makeText(getApplicationContext(),“albumHead为空”,Toast.LENGTH\u LONG);
makeToast.show();
}
}
私有静态类AlbumThread扩展线程{
Context-appContext=MediaApp.getAppContext();
List songList=new ArrayList();
公共相册线程(){
超级(“神话阅读”);
}
@凌驾
公开募捐{
//从MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI查询媒体内容
super.run();
ContentResolver albumResolver=appContext.getContentResolver();
Uri mediaContentUri=MediaStore.Audio.Media.EXTERNAL\u CONTENT\u Uri;
字符串[]mediaColumns={
MediaStore.Audio.Media.\u ID,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY\u名称,
};
字符串mediaSort=”“+MediaStore.Audio.Media.ALBUM+“ASC”+,“+MediaStore.Audio.Media.DISPLAY_NAME+“ASC”;
albumCursor=albumResolver.query(mediaContentUri、mediaColumns、null、null、mediaSort);
//从游标中提取值
if(albumCursor.moveToFirst()){
做{
int-albumIdx=albumCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
int-songIdx=albumCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
字符串albumString=albumCursor.getString(albumIdx);
String-songString=albumCursor.getString(songIdx);
如果(!albumHead.contains(albumString)){
albumHead.add(albumString);
ap.notifyDataSetChanged();
}
if(albumHead.contains(albumString)){
歌曲列表。添加(歌曲串);
albumChild.put(唱片串、歌曲列表);
} 
}while(albumCursor.moveToNext());
}
}       
}
@凌驾
受保护的void onStop(){
super.onStop();
线程=null;
Log.d(标记“albumThread stopped yapee”);
}

}

尝试使用notifyDatasetChanged()@是的,事实上我做了。但是在线里面。如果(!albumHead.contains(albumString)){albumHead.add(albumString);ap.notifyDataSetChanged();}请尝试在删除数据集后使listview无效changed@Ritaban我已经照你说的做了。但问题依然存在。实际上,我将listadapter更改为接受观察者的自定义适配器。我想如果我创建一个观察器并为适配器注册它,它可能会工作,不是吗?