使用JSON而不是常量类的通用图像加载器

时间:2013-12-19 22:33:09

标签: android json universal-image-loader

我有一个功能正常的通用图像加载器,我试图切换到从JSON而不是通常使用的常量类中获取图像URL。我创建了一个JSON解析类,它输出一个名为galleryArrList的ArrayList。但是我无法弄清楚如何实现我的JSON Parsing类以及如何修改UILGrid类中的Adapter类以接受galleryArrList String。这是课程: UILGrid类:

    import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.mysite.wcbc.UKVPConstants.Extra;

public class UILGrid extends AbsListViewBaseActivity {

String[] imageUrls;

DisplayImageOptions options;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.uil_grid);

    Bundle bundle = getIntent().getExtras();
    imageUrls = bundle.getStringArray(Extra.IMAGES);

    options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.ic_stub)
            .showImageForEmptyUri(R.drawable.ic_empty)
            .showImageOnFail(R.drawable.ic_error).cacheInMemory(true)
            .cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build();

    listView = (GridView) findViewById(R.id.uil_gridview);
    ((GridView) listView).setAdapter(new ImageAdapter());
    listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            startImagePagerActivity(position);
        }
    });
}

private void startImagePagerActivity(int position) {
    Intent intent = new Intent(this, CVP2.class); // ---- Change here
    intent.putExtra(Extra.IMAGES, imageUrls);
    intent.putExtra(Extra.IMAGE_POSITION, position);
    startActivity(intent);
}

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.uil_grid_item, parent, false);
        } else {
            imageView = (ImageView) convertView;
        }

        imageLoader.displayImage(imageUrls[position], imageView, options);

        return imageView;
    }
}
}

我的 UILJSONParse类:

    import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.AsyncTask;

public class UILJSONParse extends AsyncTask<String, String, JSONObject> {
// url to make request
private static String url = "http://www.mysite.com/apps/wcbc/galleryuil.txt";

// Hashmap for ListView
// ArrayList<HashMap<String, String>> arraylist;
ArrayList<HashMap<String, String>> galleryArrList = new ArrayList<HashMap<String,   String>>();

// JSON Node names
private static final String TAG_GALLERY = "gallery";
private static final String TAG_GALLERYURL = "galleryurl";
private static final String TAG_ID = "id";
private static final String TAG_GALLERYDESCR = "gallerydescr";

// gallery JSONArray
JSONArray JSArrGallery = null;

@Override
protected JSONObject doInBackground(String... arg0) {
    // Creating JSON Parser instance
    JGrid4Adapter jParser = new JGrid4Adapter();
    // getting JSON string from URL
    JSONObject jsonOb = jParser.getJSONFromUrl(url);
    return jsonOb;
}

@Override
protected void onPostExecute(JSONObject jsonOb) {
    try {
        JSArrGallery = jsonOb.getJSONArray(TAG_GALLERY);
        // looping through All gallery images
        for (int i = 0; i < JSArrGallery.length(); i++) {
            JSONObject galleryJO = JSArrGallery.getJSONObject(i);
            String idStr = galleryJO.getString(TAG_ID);
            String urlStr = galleryJO.getString(TAG_GALLERYURL);
            String descrStr = galleryJO.getString(TAG_GALLERYDESCR);

            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            // adding each child node to HashMap key => value
            map.put(TAG_ID, idStr);
            map.put(TAG_GALLERYURL, urlStr);
            map.put(TAG_GALLERYDESCR, descrStr);

            // adding HashMap map to ArrayList galleryArrList, defined
            // above
            galleryArrList.add(map);
        }// -- END for loop
    } catch (JSONException e) {
        e.printStackTrace();
    }// --- END Try
}// --- END onPostExecute
}// --- END UILJSONParse Class

1 个答案:

答案 0 :(得分:0)

自问这个问题以来,我已经想到了这一点。我有一个按钮接口活动,其中调用AsyncTask,在单击按钮时抓取JSON数据。然后,AysncTask捆绑数据并将其发送到我的Gallery Grid Class。 AsyncTask正在调用上面的JSON解析类。所以这是代码:

        // --- artwork button
    cartoon_BTN.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            jsonFileStr = "artwork_json";
            new ArtworkJSON().execute();

        }
    });
    // --- end artwork button

    private class ArtworkJSON extends AsyncTask<Void, Void, Void> {

    JSONObject jsonobject;
    String TAG_ID = "id";
    String TAG_DESCR = "artworkdescr";
    String TAG_MEDIUM = "artworkmedium";
    String TAG_PRICE = "artworkprice";
    String TAG_URL = "artworkurl";
    ArrayList<HashMap<String, String>> hashArraylist;
    ArrayList<String> urlArrayList;
    ArrayList<String> idArrayList;
    ArrayList<String> descrArrayList;
    ArrayList<String> mediumArrayList;
    ArrayList<String> priceArrayList;
    String[] idStrArray, urlStrArray, descrStrArray, mediumStrArray,
            priceStrArray;
    String urlPathStr = "http://www.mysite.com/"
            + jsonFileStr + ".txt";
    JSONArray JSArrArtwork = null;
    String idStr, urlStr, descrStr, mediumStr, priceStr;

    ProgressDialog loadImagesDia;
    Intent bundleIn;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Create a progressdialog
        loadImagesDia = new ProgressDialog(Main_Interface.this);
        loadImagesDia.setMessage("Loading Images...");
        loadImagesDia.setIndeterminate(false);
        // Show progressdialog
        loadImagesDia.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        hashArraylist = new ArrayList<HashMap<String, String>>();//

        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONforGallery.getJSONfromURL(urlPathStr);

        try {
            // Locate the array name in JSON
            JSArrArtwork = jsonobject.getJSONArray("artwork");
            idArrayList = new ArrayList<String>();
            urlArrayList = new ArrayList<String>();
            descrArrayList = new ArrayList<String>();
            mediumArrayList = new ArrayList<String>();
            priceArrayList = new ArrayList<String>();

            for (int i = 0; i < JSArrArtwork.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();//
                JSONObject artworkJO = JSArrArtwork.getJSONObject(i);
                map.put("id", artworkJO.getString(TAG_ID));//
                map.put("url", artworkJO.getString(TAG_URL));//
                map.put("descr", artworkJO.getString(TAG_DESCR));//
                map.put("medium", artworkJO.getString(TAG_MEDIUM));//
                map.put("price", artworkJO.getString(TAG_PRICE));//
                idStr = artworkJO.getString(TAG_ID);
                urlStr = artworkJO.getString(TAG_URL);
                descrStr = artworkJO.getString(TAG_DESCR);
                mediumStr = artworkJO.getString(TAG_MEDIUM);
                priceStr = artworkJO.getString(TAG_PRICE);

                hashArraylist.add(map);//

                idArrayList.add(idStr);
                urlArrayList.add(urlStr);
                descrArrayList.add(descrStr);
                mediumArrayList.add(mediumStr);
                priceArrayList.add(priceStr);
                idStrArray = idArrayList.toArray(new String[idArrayList
                        .size()]);
                urlStrArray = urlArrayList.toArray(new String[urlArrayList
                        .size()]);
                descrStrArray = descrArrayList
                        .toArray(new String[descrArrayList.size()]);
                mediumStrArray = mediumArrayList
                        .toArray(new String[mediumArrayList.size()]);
                priceStrArray = priceArrayList
                        .toArray(new String[priceArrayList.size()]);
            }
        } catch (JSONException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {
        loadImagesDia.dismiss();
        bundleIn = new Intent("com.veedabugmedia.ktg.UILGRID");
        bundleIn.putExtra("idStrArrayKey", idStrArray);
        bundleIn.putExtra("hashARKey", hashArraylist);
        bundleIn.putExtra("urlStrArrayKey", urlStrArray);
        bundleIn.putExtra("descrStrArrayKey", descrStrArray);
        bundleIn.putExtra("mediumStrArrayKey", mediumStrArray);
        bundleIn.putExtra("priceStrArrayKey", priceStrArray);
        startActivity(bundleIn);

    }
}

我更新的 UILGrid活动

    public class UILGrid extends AbsListViewBaseActivity {
String[] idStr, imageUrls, descrStrGrid, mediumStrGrid, priceStrGrid;
DisplayImageOptions options;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.uil_grid);

    // Retrieve data from About_Interface on item click event
    Intent getBundsIn = getIntent();
    idStr = getBundsIn.getStringArrayExtra("idStrArrayKey");
    imageUrls = getBundsIn.getStringArrayExtra("urlStrArrayKey");
    descrStrGrid = getBundsIn.getStringArrayExtra("descrStrArrayKey");
    mediumStrGrid = getBundsIn.getStringArrayExtra("mediumStrArrayKey");
    priceStrGrid = getBundsIn.getStringArrayExtra("priceStrArrayKey");



    options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.ic_stub)
            .showImageForEmptyUri(R.drawable.ic_empty)
            .showImageOnFail(R.drawable.ic_error).cacheInMemory(true)
            .cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build();

    listView = (GridView) findViewById(R.id.uil_gridview);
    ((GridView) listView).setAdapter(new ImageAdapter());
    listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            startImagePagerActivity(position);
        }
    });
}// --- END onCreate

private void startImagePagerActivity(int position) {

    Intent pagerIn = new Intent(this, UILPager.class);
    pagerIn.putExtra("pagerUrlStrKey", imageUrls);
    pagerIn.putExtra("pagerDescrStrKey", descrStrGrid);
    pagerIn.putExtra("pagerMediumStrKey", mediumStrGrid);
    pagerIn.putExtra("pagerPriceStrKey", priceStrGrid);
    pagerIn.putExtra("pagerPositionKey", position);


    startActivity(pagerIn);

}

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.uil_grid_item, parent, false);
        } else {
            imageView = (ImageView) convertView;
        }
        imageLoader.displayImage(imageUrls[position], imageView, options);
        return imageView;
    }
}

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(R.anim.fadein, R.anim.fadeout);
    UILGrid.this.finish();
}
}