我有一个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
都得到了正确的填充
答案 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>