调用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起作用。

09-04 13:01