问题
I read the Universal Image Loader and I make application that has gridview and this gridview get image from json. but my application load so slow, so I want to use Universal Image Loader but getView
function in Universal Image Loader in ImageAdapeter class it use like that
imageLoader.displayImage(imageUrls[position], imageView, options);
or for formula
imageLoader.displayImage(String, imageView, options);
So I don't have a string to complete this formula. I just can create Object arr
to store Arraylist.
How can I convert ArrayList<HashMap<String, Object>>
to string or any ways to change my code?
Please confirm or advice or recommend me as you can. easy to read my code
Below this is my ImageAdapter. it work fine but so slow.
public class ImageAdapter extends BaseAdapter {
private Context context;
private ArrayList<HashMap<String, Object>> MyArr = new ArrayList<HashMap<String, Object>>();
public ImageAdapter(Context c, ArrayList<HashMap<String, Object>> myArrList) {
context = c;
MyArr = myArrList;
}
public int getCount() {
return MyArr.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
viewHolder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.grid_item, null);
}
viewHolder.categoryCard = (ImageView) convertView.findViewById(R.id.category_card);
//==================== change area
Object arr = new ArrayList<HashMap<String, Object>>(); // make objec arr to store arraylist
arr = MyArr.get(position).get("categoryid");
if (arr.equals("1")) {
viewHolder.categoryCard.setImageResource(R.drawable.card_eat);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView1);
} else {
viewHolder.categoryCard.setImageResource(R.drawable.card_etc);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.imageView1);
}
// =============================
try {
viewHolder.imageView.setImageBitmap((Bitmap) MyArr.get(position).get("ImageThumBitmap"));
} catch (Exception e) {
viewHolder.imageView.setImageResource(android.R.drawable.ic_menu_report_image);
}
return convertView;
}
}
// Download JSON in Background
public class DownloadJSONFileAsync extends AsyncTask<String, Void, Void> {
String token = getIntent().getExtras().getString("token1");
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
}
@Override
protected Void doInBackground(String... params) {
String url = "http://xxx.xxx.xxx/card/all/20/0/?token="+token;
JSONArray data = null;
try {
JSONObject jsonObject = new JSONObject(getJSONUrl(url));
MyArrList = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map;
data = jsonObject.getJSONArray("data");
for (int i = 0; i < data.length(); i++) {
JSONObject c = data.getJSONObject(i);
map = new HashMap<String, Object>();
// Thumbnail Get ImageBitmap To Object
map.put("cardimage", (String) c.getString("cardimage"));
map.put("ImageThumBitmap",(Bitmap) loadBitmap(c.getString("cardimage")));
map.put("categoryid", (String) c.getString("categoryid"));
MyArrList.add(map);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void unused) {
ShowAllContent(); // When Finish Show Content
dismissDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
removeDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
}
}
This is ImageAdapter that come from Universal Image Loader
public class ImageAdapter extends BaseAdapter {
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if (convertView == null) {
imageView = (ImageView) getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
} else {
imageView = (ImageView) convertView;
}
// I want to do like this
imageLoader.displayImage(imageUrls[position], imageView, options);
return imageView;
}
}
回答1:
if you want to keep the ArrayList<HashMap<String, Object>>
you have to create a new String[]
this way:
String[] urls = new String[MyArrList.size()];
for(int i=0; i<MyArrList.size(); i++){
urls[i] = MyArrList.get(i).get("cardimage");
}
PS. I've used the variable name MyArrList as you declared in your code, by the way it's not a good idea to start a variable name with a capital letter.
PS2. I think that if you want to use the Universal Image Loader you'll maybe no longer need to store each Bitmap in the HashMap
回答2:
In your DownloadJSONFileAsync Class
which you posted here ,
- You have not downloaded the JSON. So your variable
JSONArray data
will always be null. On
Line 33
need not use anew ArrayList
you need to access the ArrayList which you stored inDownloadJSONFileAsync Class
. Find updated code below.public class DownloadJSONFileAsync extends AsyncTask<String, Void, Void> { String token = getIntent().getExtras().getString("token1"); JSONObject response = null; protected void onPreExecute() { super.onPreExecute(); showDialog(DIALOG_DOWNLOAD_JSON_PROGRESS); } @Override protected Void doInBackground(String... params) { String url = "http://xxx.xxx.xxx/card/all/20/0/?token="+token; JSONArray response = //YOUR JSON ARRAY AFTER DOWNLOADING; return null; } protected void onPostExecute(Void unused) { ShowAllContent(JSONArray); // When Finish Show Content and send the Response JSONARRAY and display the content on the GridView dismissDialog(DIALOG_DOWNLOAD_JSON_PROGRESS); removeDialog(DIALOG_DOWNLOAD_JSON_PROGRESS); }}
Your ShowAllContent(JSONArray jsonVal) Code
public void ShowAllContent(JSONArray jsonVal) {
gridView1 = (ScrollableGridView) findViewById(R.id.grid_all);
gridView1.setAdapter(new ImageAdapter(CardActivity.this, jsonVal));
gridView1.setExpanded(true);
gridView1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
}
});
gridView1.setOnScrollListener(new PauseOnScrollListener(true, true));
}
In your getView() method of ImageAdapter
use the below line.
public class ImageAdapter extends BaseAdapter {
private JSONArray jsonArray = null;
public ImageAdapter(Context c, JSONArray jsonArray) {
context = c;
this.jsonArray = jsonArray;
}
public int getCount() {
return jsonArray.length();
}
public View getView(int position, View convertView, ViewGroup parent) {
//DO YOUR CODE HERE
imageLoader.displayImage(jsonArray[position].get("ImageThumBitmap").toString(), imageView, options);
}
}
来源:https://stackoverflow.com/questions/14153674/want-to-convert-arraylisthashmapstring-object-to-string