简体   繁体   中英

Want to convert ArrayList<HashMap<String, Object>> to string

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;
    }
}

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

In your DownloadJSONFileAsync Class which you posted here ,

  1. You have not downloaded the JSON. So your variable JSONArray data will always be null.
  2. On Line 33 need not use a new ArrayList you need to access the ArrayList which you stored in DownloadJSONFileAsync 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);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM