ListView仅在活动重新启动时更新-Android
嗨,我在下面提供了我的代码。我有一个主UI线程和一个手动线程。我正在更新线程内的listView,并在适配器和列表视图中使用它来填充。但问题是,一旦活动启动,列表就为空,只有当配置更改时,它才会使用适配器进行更新。有什么问题吗?我的线程仅在oncreate完成后启动?请留下光标部分,因为我得到的所有值都很好。请帮助我的朋友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
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更改为接受观察者的自定义适配器。我想如果我创建一个观察器并为适配器注册它,它可能会工作,不是吗?