【发布时间】: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<Venue> values 都已正确填写
【问题讨论】:
-
getCount方法丢失。尝试覆盖它 -
嘿,这完全是错误的......而不是
ArrayAdapter<String>使用ArrayAdapter<Venue>,而不是Venue currEvent = values.get(position);使用getItem(position),摆脱构造函数和私有字段插入context使用getContext()...请记住 ViewHolder 模式
标签: java android android-listview android-asynctask