我对Android开发很陌生,我觉得我在这里有一个相对简单的问题,并设法绑定更复杂的部分但忽略了更简单的部分。我已经设置了一个ImageAdapter类,它处理在我的另一个片段中将图像显示到GridView中。最初我正在按照一个教程简单地显示一个数组中的项目列表。
我使用AsyncTask填充ArrayList,然后将ArrayList转换为Picasso在显示内容时可以处理的标准数组。
我的问题是我的ImageAdapter的AsyncTask部分没有被执行,因此Picasso使用的imageArr[]
只是保持空白。
如何确保我的适配器的AsyncTask部分实际执行?
我试过这个,但它似乎没有起作用,我觉得我有点不对......
public void onCreate() {
new GetProjects().execute();
}
我已经附上了我的代码,任何帮助都会非常感激!
请注意; ServiceHandler只是检索URL上的数据,然后将其转换为可以解析的字符串。
public class ImageAdapter extends BaseAdapter {
//JSON URL
private static String url = "www.myjsonsourceurl.com";
//JSON NODES
private static final String TAG_LOGO = "logopath";
ArrayList<String> imageUrls = new ArrayList<String>();
String[] imageArr = imageUrls.toArray(new String[imageUrls.size()]);
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return imageArr.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public void onCreate() {
new GetProjects().execute();
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(185, 185));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(3, 3, 3, 3);
} else {
imageView = (ImageView) convertView;
}
Picasso.with(mContext).setIndicatorsEnabled(true);
Picasso.with(mContext).setLoggingEnabled(true);
Picasso.with(mContext).load(imageArr[position]).placeholder(R.drawable.ajaxloader).error(R.drawable.imageunavailable).into(imageView);
return imageView;
}
// references to our images
//ASYNC task to get json by making HTTP call
public class GetProjects extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Nothing right now
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONArray json = new JSONArray(jsonStr);
// looping through All Applications
for (int i = 0; i < json.length(); i++) {
JSONObject p = json.getJSONObject(i);
String logopath = p.getString(TAG_LOGO);
imageUrls.add(logopath);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
}
答案 0 :(得分:0)
您可以覆盖BaseAdapter的onCreate方法。执行你的代码
new GetProjects().execute();
在contructor中或者从适配器外部手动调用onCreate函数(我建议更改其名称)。
答案 1 :(得分:0)
您需要调用活动或片段,其中列表的定义不在此类适配器中。将asynctask类移到您的活动中并从那里调用它。
AsyncTask提供方法 onPreExecute()和 onPostExecute(),您可以在其中播放任务已启动或已完成的消息。你应该在类的onPostExecute()中调用setAdapter()。