Хотите преобразовать ArrayList‹HashMap‹String, Object›› в строку

Я прочитал Универсальный загрузчик изображений, и я делаю приложение, которое имеет вид сетки, и этот вид сетки получает изображение из json. но мое приложение загружается так медленно, поэтому я хочу использовать универсальный загрузчик изображений, но функция getView в универсальном загрузчике изображений в классе ImageAdapeter используется так

imageLoader.displayImage(imageUrls[position], imageView, options); или для формулы imageLoader.displayImage(String, imageView, options);

Поэтому у меня нет строки для завершения этой формулы. Я просто могу создать Object arr для хранения Arraylist.

Как я могу преобразовать ArrayList<HashMap<String, Object>> в строку или каким-либо образом изменить свой код?

Пожалуйста, подтвердите или посоветуйте или порекомендуйте меня, как вы можете. легко читаемый мой код

Ниже мой ImageAdapter. он работает нормально, но так медленно.

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

}

Это ImageAdapter, полученный из Универсальный загрузчик изображений

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

person kongkea    schedule 04.01.2013    source источник
comment
1) У вас ArrayList<HashMap<String, Object>>, верно? 2) Содержит ли каждый HashMap URL-адрес изображения?   -  person Paresh Mayani    schedule 04.01.2013
comment
такое содержание MyArr.get(position).get("categoryid")   -  person kongkea    schedule 04.01.2013


Ответы (2)


если вы хотите сохранить ArrayList<HashMap<String, Object>>, вам нужно создать новый String[] следующим образом:

String[] urls = new String[MyArrList.size()];
for(int i=0; i<MyArrList.size(); i++){
   urls[i] = MyArrList.get(i).get("cardimage");
}

PS. Я использовал имя переменной MyArrList, как вы объявили в своем коде, кстати, не рекомендуется начинать имя переменной с заглавной буквы.

PS2. Я думаю, что если вы хотите использовать универсальный загрузчик изображений, вам, возможно, больше не нужно хранить каждое растровое изображение в HashMap.

person Noya    schedule 04.01.2013
comment
Как я могу изменить весь этот код. Я так хочу изменить его. Я хочу улучшить его быстрее. pastie.org/5620383 - person kongkea; 04.01.2013

В вашем DownloadJSONFileAsync Class, который вы разместили здесь,

  1. Вы не скачали JSON. Таким образом, ваша переменная JSONArray data всегда будет нулевой.
  2. На Line 33 не нужно использовать new ArrayList, вам нужно получить доступ к ArrayList, который вы сохранили в DownloadJSONFileAsync Class. Найдите обновленный код ниже.

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

Ваш код ShowAllContent (JSONArray jsonVal)

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

}

В вашем getView() method of ImageAdapter используйте строку ниже.

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);
    }
}
person Lalith B    schedule 04.01.2013
comment
Я не могу добавить JSONArray в ShowAllContent. См. полный исходный код. Пожалуйста, помогите мне немного измениться - person kongkea; 04.01.2013