getView永远不会因为我之外的原因而被调用

时间:2012-07-07 02:05:30

标签: java android listview adapter

我有一个通过asynctask填充的自定义列表视图适配器,我在onprogress函数中调用notifydatasetchanged,而getCount()返回10,但我的列表从未显示,我设置了一个断点并确定getView()根本就没有叫做。有任何想法吗?我已经尝试了几个小时,我只是难倒。我在另一个活动中做了完全相同的事情,除了一个使用了视图,这个只保存基于文本的数据,所以我没有打扰。

适配器:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  if(row == null) {
    row = inflater.inflate(R.layout.podcastepisode, null);
  }
  PodcastItem item = items.get(position);
  TextView episodeTitle = (TextView)row.findViewById(R.id.episodeTitle);
  TextView episodeDate = (TextView)row.findViewById(R.id.episodeDate);
  episodeTitle.setText(item.title);
  episodeDate.setText(API.FormatPodcastDate(item.date));
  return row;
}

我的任务:

protected void onProgressUpdate(PodcastItem... progress) {
  AddPodcastActivity.episodes.add(progress[0]);
  AddPodcastActivity.adapter.notifyDataSetChanged();
}

1 个答案:

答案 0 :(得分:1)

我建议将列表适配器从Activity文件中移动到它自己的文件中,并使用以下内容:

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class EpisodeArrayAdapter extends BaseAdapter {

    public EpisodeArrayAdapter(Context context) {
        mContext = context;
        items = new ArrayList<PodcastItem>();
    }

    private Context mContext;
    private ArrayList<PodcastItem> items;

    public void add(PodcastItem item) {
        items.add(item);
        notifyDataSetChanged();
    }

    public void remove(int index) {
        items.remove(index);
        notifyDataSetChanged();
    }

    public void clear() {
        items.clear();
        notifyDataSetChanged();
    }

    @Override
    public int getCount() { return items.size(); }

    @Override
    public Object getItem(int position) { return items.get(position); }

    @Override
    public long getItemId(int position) { return position; }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if(row == null) row = LayoutInflater.from(mContext).inflate(R.layout.podcastepisode, null);
        PodcastItem item = items.get(position);
        TextView episodeTitle = (TextView)row.findViewById(R.id.episodeTitle);
        TextView episodeDate = (TextView)row.findViewById(R.id.episodeDate);
        episodeTitle.setText(item.title);
        episodeDate.setText(API.FormatPodcastDate(item.date));
        return row;
    }
}

这是我们用于Boid中所有列表适配器的代码类型:)另外,请注意add / remove / clear函数调用notifyDataSetChanged(),这使得您不必自己调用它添加项目。

初始化时,您只需使用:

EpisodeArrayAdapter adapter = new EpisodeArrayAdapter(this);
listView.setAdapter(adapter);

使用add()函数添加项目将导致列表立即更新。确保为使用适配器的列表视图调用setAdapter,否则将没有任何连接,列表中不会显示任何内容(在代码中没有看到对此的调用)。

相关问题