调用notifyDataChanged()方法时,列表视图未更新数据。
在onCreate()方法中,我初始化了没有数据的列表视图。
ListView videoList = (ListView)findViewById(R.id.videos_list);
videoList.setOnItemClickListener(listener);
listAdapter = new PHVideosListAdapter(PHVideosActivity.this, videos);
videoList.setAdapter(listAdapter);
之后,我开始使用新的VideosCategoryFetchTask()。execute();来获取视频列表。
在我调用的后执行方法中
@Override
protected void onPostExecute(Boolean success) {
if(success) {
listAdapter.notifyDataSetChanged();
} else {
//show dialog
}
}
但列表上没有任何显示。如果有人知道解决方案,请帮忙...
private class VideosDetailsFetchTask extends AsyncTask<String, Void, Boolean> {
@Override
public void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
Boolean success = false;
try {
if (params.length >= 0) {
videos = (Videos)videoAPI.videosForCategoryId(params[0],new VideosParser());
success = true;
}
} catch (Exception e) {
// TODO: handle exception
}
return success;
}
@Override
protected void onPostExecute(Boolean success) {
if(success) {
progressBar.setVisibility(View.INVISIBLE);
onFinishVideoFetch();
} else {
//show dialog
}
}
}
这里使用两个异步类,第一个在onPostExecute()上被调用。
private void onFinishVideoFetch() {
if(videos != null) {
listAdapter.notifyDataSetChanged();
}
}
我不是一一抓取视频..这里返回的是视频列表...。
获取视频列表后,我想刷新列表。
@Override
protected void onProgressUpdate(Videos... values) {
videos = values[0];
//add published object to list which holds
listAdapter.notifyDataSetChanged();
}
我尝试过,但是没有运气请帮忙。
这是使用的适配器类
公共类PHVideosListAdapter扩展BaseAdapter {
private Videos videoTitles;
private LayoutInflater inflater;
public PHVideosListAdapter(Context context, Videos videoTitles) {
inflater = LayoutInflater.from(context);
this.videoTitles = videoTitles;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if(videoTitles != null) {
return videoTitles.size();
}
else {
return 0;
}
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return videoTitles.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
VideoListViewHolder holder = null;
if (convertView == null) {
holder = new VideoListViewHolder();
convertView = inflater.inflate(R.layout.videos_list, null);
holder.videoTitle = (TextView) convertView.findViewById(R.id.video_title);
holder.videoImage = (ImageView) convertView.findViewById(R.id.video_image);
holder.videoDuration = (TextView) convertView.findViewById(R.id.video_duration);
convertView.setTag(holder);
} else {
holder = (VideoListViewHolder)convertView.getTag();
}
holder.videoImage.setImageResource(R.drawable.icon);
holder.videoDuration.setText("00:10");
holder.videoTitle.setText(videoTitles.get(position).getVideoTitle());
return convertView;
}
private class VideoListViewHolder {
ImageView videoImage;
TextView videoTitle;
TextView videoDuration;
}
}
最佳答案
首次创建PHVideosListAdapter
时,它包含对Videos
列表的引用,我认为该列表是您的Activity的成员。在您的doInBackground
方法中,对videoAPI.videosForCategoryId
的调用正在更新您Activity中的Videos
引用,但是适配器仍保留传递给PHVideosListAdapter
的构造函数的原始引用。您需要在PHVideosListAdapter
中重新创建onPostExecute
或在PHVideosListAdapter
中添加一个set方法来更改私有变量videoTitles
。
我使用Google提供的ArrayAdapter
遇到了同样的问题。您只能在构造函数中设置基础List
,因此必须重新创建ArrayAdapter或创建自己的类,该类允许更改基础数据才能使notifyDataSetChanged
起作用。