getCount() 在 BaseAdapter 构造方法完成执行之前被调用
getCount() is being called before BaseAdapter constructor method finishes executing
我是 android 的新手。我正在尝试创建一个 GridView
由 ImageView 组成。图片来自 flickr,我正在使用 flickr API 搜索 flickr 并接收 JSON 响应。我解析 JSON 数据以获取图像 URL。 API 调用和解析 JSON 数据是在扩展了 BaseAdapter 的 FlickrAdapter 内部完成的。但问题是我的 getView() 方法从未被调用过。我搜索了 Whosebug for this,发现如果没有数据显示,则不会调用 getView()。但我在 FlickrAdapter 构造函数中设置数据。我在方法中设置了一些调试文本,我看到在设置数据之前调用了 getCount(),这意味着在 FlickrAdapter 构造函数完成执行之前调用了 getCount()。所以 getView() 永远不会被调用。
我希望在我的 FlickrAdapter 的构造方法完成执行后调用 getCount() 方法。
我该如何解决这个问题?
这是我的 BaseAdapter 和其他代码 类
FlickrAdapter.java
public class FlickrAdapter extends BaseAdapter {
public ArrayList<FlickrImage> flickrImagesList;
private Context context;
public static FlickrAdapter instance;
FlickrAdapter(final Context context, String searchText, Activity activity) {
this.flickrImagesList = new ArrayList<FlickrImage>();
this.context = context;
instance = this;
Flickr flickr = new Flickr(searchText, context, activity);
//row[0] = inflater.inflate(R.layout.template, null, false);
Log.d("URL", flickr.buildApiUrl());
DownloadManager.getJsonResponse(flickr.buildApiUrl(), context, new VolleyCallBack<JSONObject>() {
@Override
public void onSuccess(JSONObject success) {
//Log.d("JSON",success.toString());
try {
success = success.getJSONObject("photos");
JSONArray photo = success.getJSONArray("photo");
for (int i = 0; i < photo.length(); i++) {
JSONObject tempObject = photo.getJSONObject(i);
String result = new StringBuilder("https://farm" + tempObject.get("farm").toString() +
".staticflickr.com/" +
tempObject.get("server").toString() +
"/" +
tempObject.get("id").toString() +
"_" +
tempObject.get("secret").toString() +
"_n.jpg").toString();
FlickrImage image = new FlickrImage(i, result);
instance.flickrImagesList.add(image);
Log.d("SIZE", String.valueOf(instance.flickrImagesList.size()));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
@Override
public int getCount() {
Log.d("COUNT",String.valueOf(flickrImagesList.size()));
return flickrImagesList.size();
}
@Override
public Object getItem(int position) {
return flickrImagesList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
class ViewHolder {
ImageView myImage;
ViewHolder(View v) {
myImage = (ImageView) v.findViewById(R.id.individulaImage);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder = null;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.individual_image, parent, false);
holder = new ViewHolder(row);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
FlickrImage tempImage = flickrImagesList.get(position);
Log.d("Address", tempImage.imageName);
//ImageView iv = (ImageView) convertView.findViewById(R.id.individulaImage);
//Picasso.with(context).load(tempImage.imageName).into(iv);
return row;
}}
Flickr.java
public class Flickr {
private StringBuilder urlBuilder = new StringBuilder("https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=e78808f6cf756218d6981fcdf8021f0c&tags=");
private String apiUrl = "";
private Context context = null;
private Activity activity;
private String[] individualImageUrl;
private String keyWord = "";
public Flickr(String keyWord, Context context, Activity activity) {
this.keyWord=keyWord;
this.apiUrl = buildApiUrl();
this.context = context;
this.activity = activity;
//Log.d("APIURL", this.apiUrl);
}
public String buildApiUrl() {
String[] temp;
StringBuilder sb = new StringBuilder();
temp = this.keyWord.split(" ");
for (int i = 0; i < temp.length; i++) {
sb.append(temp[i]);
if (i != (temp.length - 1)) {
sb.append("+");
}
}
urlBuilder.append(sb);
urlBuilder.append("&text=");
urlBuilder.append(sb);
urlBuilder.append("&format=json&nojsoncallback=1");
return urlBuilder.toString();
}}
FlickrImage.java
public class FlickrImage {
public int imageId;
public String imageName;
FlickrImage(int imageId, String imageURL) {
this.imageId = imageId;
this.imageName = imageURL;
}
}
VolleyCallBack.java
public interface VolleyCallBack<T> {
public void onSuccess(T success);
}
DownloadManager.java
public class DownloadManager {
public static void getJsonResponse(final String Url, Context context, final VolleyCallBack callBack) {
JsonObjectRequest flickrJsonRequest = new JsonObjectRequest(Request.Method.GET, Url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callBack.onSuccess(response);
}
},
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
Volley.newRequestQueue(context).add(flickrJsonRequest);
}
}
它不会在您的构造函数完成之前被调用。您的 Web 代码 运行s 在一个单独的线程中,以便您的构造函数代码完成,然后调用 getCount。一旦您的 Web 代码完成,就会调用 onSuccess。
不建议在适配器中使用 运行 网络代码。 运行 它在你的 activity 或片段中,一旦它完成调用你的适配器上的 notifyDatasetChanged() 。
我是 android 的新手。我正在尝试创建一个 GridView 由 ImageView 组成。图片来自 flickr,我正在使用 flickr API 搜索 flickr 并接收 JSON 响应。我解析 JSON 数据以获取图像 URL。 API 调用和解析 JSON 数据是在扩展了 BaseAdapter 的 FlickrAdapter 内部完成的。但问题是我的 getView() 方法从未被调用过。我搜索了 Whosebug for this,发现如果没有数据显示,则不会调用 getView()。但我在 FlickrAdapter 构造函数中设置数据。我在方法中设置了一些调试文本,我看到在设置数据之前调用了 getCount(),这意味着在 FlickrAdapter 构造函数完成执行之前调用了 getCount()。所以 getView() 永远不会被调用。 我希望在我的 FlickrAdapter 的构造方法完成执行后调用 getCount() 方法。 我该如何解决这个问题?
这是我的 BaseAdapter 和其他代码 类
FlickrAdapter.java
public class FlickrAdapter extends BaseAdapter {
public ArrayList<FlickrImage> flickrImagesList;
private Context context;
public static FlickrAdapter instance;
FlickrAdapter(final Context context, String searchText, Activity activity) {
this.flickrImagesList = new ArrayList<FlickrImage>();
this.context = context;
instance = this;
Flickr flickr = new Flickr(searchText, context, activity);
//row[0] = inflater.inflate(R.layout.template, null, false);
Log.d("URL", flickr.buildApiUrl());
DownloadManager.getJsonResponse(flickr.buildApiUrl(), context, new VolleyCallBack<JSONObject>() {
@Override
public void onSuccess(JSONObject success) {
//Log.d("JSON",success.toString());
try {
success = success.getJSONObject("photos");
JSONArray photo = success.getJSONArray("photo");
for (int i = 0; i < photo.length(); i++) {
JSONObject tempObject = photo.getJSONObject(i);
String result = new StringBuilder("https://farm" + tempObject.get("farm").toString() +
".staticflickr.com/" +
tempObject.get("server").toString() +
"/" +
tempObject.get("id").toString() +
"_" +
tempObject.get("secret").toString() +
"_n.jpg").toString();
FlickrImage image = new FlickrImage(i, result);
instance.flickrImagesList.add(image);
Log.d("SIZE", String.valueOf(instance.flickrImagesList.size()));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
@Override
public int getCount() {
Log.d("COUNT",String.valueOf(flickrImagesList.size()));
return flickrImagesList.size();
}
@Override
public Object getItem(int position) {
return flickrImagesList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
class ViewHolder {
ImageView myImage;
ViewHolder(View v) {
myImage = (ImageView) v.findViewById(R.id.individulaImage);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder = null;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.individual_image, parent, false);
holder = new ViewHolder(row);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
FlickrImage tempImage = flickrImagesList.get(position);
Log.d("Address", tempImage.imageName);
//ImageView iv = (ImageView) convertView.findViewById(R.id.individulaImage);
//Picasso.with(context).load(tempImage.imageName).into(iv);
return row;
}}
Flickr.java
public class Flickr {
private StringBuilder urlBuilder = new StringBuilder("https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=e78808f6cf756218d6981fcdf8021f0c&tags=");
private String apiUrl = "";
private Context context = null;
private Activity activity;
private String[] individualImageUrl;
private String keyWord = "";
public Flickr(String keyWord, Context context, Activity activity) {
this.keyWord=keyWord;
this.apiUrl = buildApiUrl();
this.context = context;
this.activity = activity;
//Log.d("APIURL", this.apiUrl);
}
public String buildApiUrl() {
String[] temp;
StringBuilder sb = new StringBuilder();
temp = this.keyWord.split(" ");
for (int i = 0; i < temp.length; i++) {
sb.append(temp[i]);
if (i != (temp.length - 1)) {
sb.append("+");
}
}
urlBuilder.append(sb);
urlBuilder.append("&text=");
urlBuilder.append(sb);
urlBuilder.append("&format=json&nojsoncallback=1");
return urlBuilder.toString();
}}
FlickrImage.java
public class FlickrImage {
public int imageId;
public String imageName;
FlickrImage(int imageId, String imageURL) {
this.imageId = imageId;
this.imageName = imageURL;
}
}
VolleyCallBack.java
public interface VolleyCallBack<T> {
public void onSuccess(T success);
}
DownloadManager.java
public class DownloadManager {
public static void getJsonResponse(final String Url, Context context, final VolleyCallBack callBack) {
JsonObjectRequest flickrJsonRequest = new JsonObjectRequest(Request.Method.GET, Url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callBack.onSuccess(response);
}
},
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
Volley.newRequestQueue(context).add(flickrJsonRequest);
}
}
它不会在您的构造函数完成之前被调用。您的 Web 代码 运行s 在一个单独的线程中,以便您的构造函数代码完成,然后调用 getCount。一旦您的 Web 代码完成,就会调用 onSuccess。
不建议在适配器中使用 运行 网络代码。 运行 它在你的 activity 或片段中,一旦它完成调用你的适配器上的 notifyDatasetChanged() 。