【问题标题】:ListView filled from AsyncTask doesn't render从 AsyncTask 填充的 ListView 不呈现
【发布时间】:2014-08-20 12:23:59
【问题描述】:

我有一个 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&lt;Venue&gt; values 都已正确填写

【问题讨论】:

  • getCount 方法丢失。尝试覆盖它
  • 嘿,这完全是错误的......而不是ArrayAdapter&lt;String&gt;使用ArrayAdapter&lt;Venue&gt;,而不是Venue currEvent = values.get(position);使用getItem(position),摆脱构造函数和私有字段插入context使用getContext() ...请记住 ViewHolder 模式

标签: java android android-listview android-asynctask


【解决方案1】:

覆盖EventListArrayAdapter 中的getCount 方法

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

更改 EventListArrayAdapter 构造函数中的 super 调用

super(context, R.layout.single_event_list_item);

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

您还需要将extends ArrayAdapter&lt;String&gt; 更改为extends ArrayAdapter&lt;Venue&gt;

【讨论】:

  • 谢谢伙计,工作就像一个魅力。当我被允许时会接受:)
  • “OR”解决方案将不起作用,因为EventListArrayAdapter 的基类是ArrayAdapter&lt;String&gt;,而valuesList&lt;Venue&gt; 的类型
  • @Selvin 编辑了答案。我错过了那部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多