从AsyncTask填充的ListView不呈现

时间:2014-08-20 12:24:00

标签: java android android-listview android-asynctask

我有一个Task扩展了Androids AsyncTask,以便从我的数据库中获取数据。我这样做是为了避免NetworkingOnMainThread例外(我知道你可以设置StrictMode但是在我的意见中它更像是一个黑客而不是一个解决方案。)

我没有任何错误。我在调试中检查了值,并且从数据库中正确获取了所有内容。我有一个Venue,我在其中设置了我的名字,描述,图像等......我用于适配器的ArrayList<Venue>得到了正确的实例化。

问题是 - ListView没有呈现。

这是我的自定义适配器代码

public class EventListArrayAdapter extends ArrayAdapter<String> {
Context context;
ArrayList<Venue> values;

public EventListArrayAdapter(Context context, ArrayList<Venue> values) {
    super(context, R.layout.single_event_list_item);
    this.context = context;
    this.values = values;
}

public View getView(int position, View convertView, ViewGroup parent){
    View v = convertView;

    if(v==null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.single_event_list_item, null);
    }

    Venue currEvent = values.get(position);

    if(currEvent!=null){
        TextView singleItemTitle = (TextView) v.findViewById(R.id.singleItemTitle);
        TextView singleItemLocation = (TextView) v.findViewById(R.id.singleItemLocation);
        TextView singleItemDate = (TextView) v.findViewById(R.id.singleItemDate);
        ImageView singleItemImage = (ImageView) v.findViewById(R.id.singleItemImage);

        singleItemTitle.setText(currEvent.getName());
        singleItemDate.setText(currEvent.getDate());
        singleItemLocation.setText(currEvent.getLocation());
        singleItemImage.setImageBitmap(currEvent.getVenueImage());
    }
    return v;
}

}

这是我的AsyncTask代码

private class FillContentTask extends AsyncTask<String, Void, Void> {
    ArrayList<Venue> venues;
    Context activity;
    ProgressDialog dialog;

    public FillContentTask(Context context) {
        this.activity = context;
    }

    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(activity);
        dialog.setTitle("Loading...");
        dialog.show();
    }

    @Override
    protected Void doInBackground(String... params) {
        this.venues = Venue.getAll();
        for (Venue currentVenue : this.venues) {
            try {
                InputStream in = new java.net.URL(currentVenue.getImageURL()).openStream();
                currentVenue.setVenueImage(BitmapFactory.decodeStream(in));
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        ListView list = (ListView) findViewById(R.id.eventList);
        EventListArrayAdapter adapter = new EventListArrayAdapter(activity, this.venues);
        list.setAdapter(adapter);
        dialog.hide();
    }
}

正如我已经说过的那样。据我所知,AsnycTask正确地完成了工作,因为所有ArrayList<Venue> values都得到了正确的填充

1 个答案:

答案 0 :(得分:3)

覆盖getCount

中的EventListArrayAdapter方法
@Override
public int getCount()
{
  return values.size();
}

OR

更改EventListArrayAdapter构造函数中的super调用
super(context, R.layout.single_event_list_item);

super(context, R.layout.single_event_list_item,values);

您还需要将extends ArrayAdapter<String>更改为extends ArrayAdapter<Venue>