0

Universal Image Loaderを読み、gridviewを備えたアプリケーションを作成し、このgridviewはjsonから画像を取得します。しかし、私のアプリケーションのロードは非常に遅いので、Universal Image Loaderを使用したいのですがgetView、ImageAdapeterクラスのUniversalImageLoaderで機能します。

imageLoader.displayImage(imageUrls[position], imageView, options);または式の場合 imageLoader.displayImage(String, imageView, options);

したがって、この式を完成させるための文字列がありません。Object arrArraylistを格納するために作成できます。

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

2 に答える 2

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。Universal Image Loaderを使用する場合は、各ビットマップをHashMapに保存する必要がなくなると思います。

于 2013-01-04T09:04:38.913 に答える
1

あなたがここに投稿したDownloadJSONFileAsync Classあなたの中で、

  1. JSONをダウンロードしていません。したがって、変数JSONArray dataは常にnullになります。
  2. Line 33を使用する必要がない場合は、に格納したArrayListnew 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);
    }
}
于 2013-01-04T08:58:32.817 に答える