如何使用Hashmap从JSON webservice获取和显示缩略图?

时间:2014-10-31 08:39:03

标签: android json web-services

我从日志中的json webservice获得了图像路径。我使用hashmap在listview中使用json显示图像。但无法在列表视图中显示任何图像。以下是我的源代码。

 public class New_PDF_List extends Activity {

    ListView mListView;

//  Default url
    private static String strUrl = "http://thetilesofindia.com/webservice.php";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Remove Titlebar
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Remove Notificationbar
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
        setContentView(R.layout.pdf_list);    


        // Creating a new non-ui thread task to download json data 
        DownloadTask downloadTask = new DownloadTask();

        // Starting the download process
        downloadTask.execute(strUrl);

        // Getting a reference to ListView of activity_main
        mListView = (ListView) findViewById(R.id.listView1);
    }

    /** A method to download json data from url */
    private String downloadUrl(String strUrl) throws IOException{
        String data = "";
        InputStream iStream = null;
        try{
                URL url = new URL(strUrl);

                // Creating an http connection to communicate with url 
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url 
                urlConnection.connect();

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

                StringBuffer sb  = new StringBuffer();

                String line = "";
                while( ( line = br.readLine())  != null){
                    sb.append(line);
                }

                data = sb.toString();

                br.close();

        }catch(Exception e){
                Log.d("Exception while downloading url", e.toString());
        }finally{
                iStream.close();
        }

        return data;
    }

    /** AsyncTask to download json data */
    private class DownloadTask extends AsyncTask<String, Integer, String>{
        String data = null;
                @Override
                protected String doInBackground(String... url) {
                        try{
                            data = downloadUrl(url[0]);

                        }catch(Exception e){
                            Log.d("Background Task",e.toString());
                        }
                        return data;
                }

                @Override
                protected void onPostExecute(String result) {

                        // The parsing of the xml data is done in a non-ui thread 
                        ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();

                        // Start parsing xml data
                        listViewLoaderTask.execute(result);                        

                }
    }

    /** AsyncTask to parse json data and load ListView */
    private class ListViewLoaderTask extends AsyncTask<String, Void, SimpleAdapter>{

        JSONObject jObject;
        // Doing the parsing of xml data in a non-ui thread 
        @Override
        protected SimpleAdapter doInBackground(String... strJson) {
            try{
                jObject = new JSONObject(strJson[0]);
                TileJSONParser tilesjsonparser = new TileJSONParser();
                tilesjsonparser.parse(jObject);
            }catch(Exception e){
                Log.d("JSON Exception1",e.toString());
            }

            // Instantiating json parser class
            TileJSONParser tilesjsonparser = new TileJSONParser();

            // A list object to store the parsed countries list
            List<HashMap<String, Object>> countries = null;

            try{
                // Getting the parsed data as a List construct
                countries = tilesjsonparser.parse(jObject);
            }catch(Exception e){
                Log.d("Exception",e.toString());
            }          

            // Keys used in Hashmap 
            String[] from = { "name","imagepath"};

            // Ids of views in listview_layout
            int[] to = { R.id.mtextview_title,R.id.mImageview_pdf};



            // Instantiating an adapter to store each items
            // R.layout.listview_layout defines the layout of each item         
            SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), countries, R.layout.list_item, from, to);  

            return adapter;
        }

        private void loadNetworkThumNail(final Context context,
                ImageView imageview, String Url) {
            // TODO Auto-generated method stub
             Picasso.with(context).load(Url.trim()).resize(98, 98).placeholder(R.drawable.ic_launcher).into(imageview);
        }

        /** Invoked by the Android on "doInBackground" is executed */
        @Override
        protected void onPostExecute(SimpleAdapter adapter) {

            // Setting adapter for the listview
            mListView.setAdapter(adapter);

            for(int i=0;i<adapter.getCount();i++){
                HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(i);
                String imgUrl = (String) hm.get("image_flag_path");
                ImageLoaderTask imageLoaderTask = new ImageLoaderTask();

                HashMap<String, Object> hmDownload = new HashMap<String, Object>();
                hm.put("image_flag_path",imgUrl);
                hm.put("position", i);

                // Starting ImageLoaderTask to download and populate image in the listview 
                imageLoaderTask.execute(hm);
            }
        }       
    }

    /** AsyncTask to download and load an image in ListView */
    private class ImageLoaderTask extends AsyncTask<HashMap<String, Object>, Void, HashMap<String, Object>>{

        @Override
        protected HashMap<String, Object> doInBackground(HashMap<String, Object>... hm) {

            InputStream iStream;
            String imgUrl = (String) hm[0].get("image_flag_path");
            int position = (Integer) hm[0].get("position");

            URL url;
            try {
                url = new URL(imgUrl);

                // Creating an http connection to communicate with url
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url                
                urlConnection.connect();

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                // Getting Caching directory 
                File cacheDirectory = getBaseContext().getCacheDir();

                // Temporary file to store the downloaded image 
                File tmpFile = new File(cacheDirectory.getPath() + "/the_tiles_of_india_"+position+".png");             

                // The FileOutputStream to the temporary file
                FileOutputStream fOutStream = new FileOutputStream(tmpFile);

             /*   // Creating a bitmap from the downloaded inputstream
                Bitmap b = BitmapFactory.decodeStream(iStream);             

                // Writing the bitmap to the temporary file as png file
                b.compress(Bitmap.CompressFormat.PNG,100, fOutStream);      */        

                // Flush the FileOutputStream
                fOutStream.flush();

                //Close the FileOutputStream
                fOutStream.close();             

                // Create a hashmap object to store image path and its position in the listview
                HashMap<String, Object> hmBitmap = new HashMap<String, Object>();

                // Storing the path to the temporary image file
                hmBitmap.put("imagepath",tmpFile.getPath());

                // Storing the position of the image in the listview
                hmBitmap.put("position",position);              

                // Returning the HashMap object containing the image path and position
                return hmBitmap;                


            }catch (Exception e) {              
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(HashMap<String, Object> result) {
            // Getting the path to the downloaded image
            String path = (String) result.get("imagepath");         

            // Getting the position of the downloaded image
            int position = (Integer) result.get("position");

            // Getting adapter of the listview
            SimpleAdapter adapter = (SimpleAdapter ) mListView.getAdapter();

            // Getting the hashmap object at the specified position of the listview
            @SuppressWarnings("unchecked")
            HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(position);   

            // Overwriting the existing path in the adapter 
            hm.put("imagepath",path);

            // Noticing listview about the dataset changes
            adapter.notifyDataSetChanged(); 
        }
    }

}

下面是具有Listview

的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ffffff" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/tiles_logo" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_marginBottom="16dp"
        android:layout_marginLeft="87dp"
        android:layout_toRightOf="@+id/imageView1"
        android:background="@drawable/info_btn" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_marginLeft="21dp"
        android:layout_toRightOf="@+id/button1"
        android:background="@drawable/delete_btn" />

    <Button
        android:id="@+id/button3"
        android:layout_width="55dp"
        android:layout_height="43dp"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignParentRight="true"
        android:background="@drawable/refresh_btn" />

    <Button
        android:id="@+id/mPdf_list_btn_more"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/imageView1"
        android:layout_below="@+id/button3"
        android:background="@drawable/more_button" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/mPdf_list_btn_more" >

    </ListView>

</RelativeLayout>

下面是另一个在simpleAdapter中使用的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/mImageview_pdf"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/mtextview_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/mImageview_pdf"
        android:layout_marginBottom="14dp"
        android:layout_marginLeft="57dp"
        android:layout_toRightOf="@+id/mImageview_pdf"
        android:textColor="#ea0b1e"
        android:text="TextView" />

    <TextView
        android:id="@+id/mtextview_type"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/mtextview_title"
        android:layout_below="@+id/mtextview_title"
        android:text="Free" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/mtextview_type"
        android:layout_below="@+id/mtextview_type"
        android:layout_marginTop="21dp"
        android:background="@drawable/btn_download" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

在做了很多R&amp; D后,我得到了我的问题的答案。

   public static final int DIALOG_DOWNLOAD_JSON_PROGRESS = 0;
    private ProgressDialog mProgressDialog;

    Button mButtonHelp,mButtonDelete,mButtonRefresh;
    ArrayList<HashMap<String, Object>> MyArrList;
    public static final String TAG_DOCUMENT = "docs";
    public static final String TAG_TITLE = "name";
    public static final String TAG_PDF_PATH = "path";
    public static final String TAG_IMAGEPATH = "imagepath";
    JSONArray document = null;
    ListView lstView1;
//  Default url
    private static String url = "your url";
    Button mPdf_list_btn_more;
    ProgressDialog pDialog;
    // flag for Internet connection status
    Boolean isInternetPresent = false;
    ConnectionDetector cd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Remove Titlebar
                this.requestWindowFeature(Window.FEATURE_NO_TITLE);

                // Remove Notificationbar
                this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
        setContentView(R.layout.pdf_list);

         // Permission StrictMode
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        lstView1 = (ListView)findViewById(R.id.listView1);

        mPdf_list_btn_more = (Button)findViewById(R.id.mPdf_list_btn_more);
        mPdf_list_btn_more.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent i = new Intent(PDF_List_New.this,Info_Screen.class);
                startActivity(i);
            }
        });

        mButtonHelp = (Button)findViewById(R.id.mButtonHelp);
        mButtonHelp.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Help", 2).show();
            }
        });

        mButtonDelete = (Button)findViewById(R.id.mButtonDelete);
        mButtonDelete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Delete", 2).show();
            }
        });

        mButtonRefresh = (Button)findViewById(R.id.mButtonRefresh);
        mButtonRefresh.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                new DownloadJSONFileAsync().execute();
            }
        });


        // Download JSON File   
        new DownloadJSONFileAsync().execute();

    }

      @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case DIALOG_DOWNLOAD_JSON_PROGRESS:
                mProgressDialog = new ProgressDialog(this);
                mProgressDialog.setMessage("Please Wait.....");
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                mProgressDialog.setCancelable(true);
                mProgressDialog.show();
                return mProgressDialog;
            default:
                return null;
            }
        }

      // Show All Content
        public void ShowAllContent()
        {
            // listView1
            lstView1 = (ListView)findViewById(R.id.listView1); 
            lstView1.setAdapter(new ImageAdapter(PDF_List_New.this, MyArrList));

        }

        // Download JSON in Background
        public class DownloadJSONFileAsync extends AsyncTask<String, Void, Void> {

            protected void onPreExecute() {
                super.onPreExecute();
                showDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);

                 ImageAdapter imgadapter=new ImageAdapter(PDF_List_New.this, MyArrList);
                   imgadapter.notifyDataSetChanged();
                   lstView1.invalidate();
            }

            @Override
            protected Void doInBackground(String... params) {
                // TODO Auto-generated method stub


                ServiceHandler sh = new ServiceHandler();
                 // Making a request to url and getting response
                String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

                Log.d("Response: ", "> " + jsonStr);


                if (jsonStr != null) {
                    try {
                        JSONObject jsonObj = new JSONObject(jsonStr);
                        MyArrList = new ArrayList<HashMap<String, Object>>();
                        HashMap<String, Object> map;

                        // Getting JSON Array node
                           document = jsonObj.getJSONArray(TAG_DOCUMENT);
                        // looping through All Contacts
                           for (int i = 0; i < document.length(); i++) {
                               JSONObject c = document.getJSONObject(i);
                               String name = c.getString(TAG_TITLE);
                               String image_path = c.getString(TAG_IMAGEPATH);
                               String pdf_path = c.getString(TAG_PDF_PATH);
                               Log.i("Name:--->", name);
                               Log.i("Image_Path--->",image_path);
                               Log.i("PDF Download Path", pdf_path);

                               // tmp hashmap for single contact

                               map = new HashMap<String, Object>();
                               map.put("name", (String)c.getString("name"));
                               map.put("imagepath", (Bitmap)loadBitmap(c.getString("imagepath")));
                               MyArrList.add(map);

                           }

                    }
                    catch(JSONException e){

                    }
                   }
                else {
                    Log.e("ServiceHandler", "Couldn't get any data from the url");
                }


                return null;
            }

            protected void onPostExecute(Void unused) {
                ShowAllContent(); // When Finish Show Content
                dismissDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
                removeDialog(DIALOG_DOWNLOAD_JSON_PROGRESS);
            }


        }

        /*** Get JSON Code from URL ***/
        public String getJSONUrl(String url) {
            StringBuilder str = new StringBuilder();
            HttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            try {
                HttpResponse response = client.execute(httpGet);
                StatusLine statusLine = response.getStatusLine();
                int statusCode = statusLine.getStatusCode();
                if (statusCode == 200) { // Download OK
                    HttpEntity entity = response.getEntity();
                    InputStream content = entity.getContent();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        str.append(line);
                    }
                } else {
                    Log.e("Log", "Failed to download file..");
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str.toString();
        }

        /***** Get Image Resource from URL (Start) *****/
        private static final String TAG = "Image";
        private static final int IO_BUFFER_SIZE = 4 * 1024;
        public static Bitmap loadBitmap(String url) {
            Bitmap bitmap = null;
            InputStream in = null;
            BufferedOutputStream out = null;

            try {
                in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);

                final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
                out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
                copy(in, out);
                out.flush();

                final byte[] data = dataStream.toByteArray();
                BitmapFactory.Options options = new BitmapFactory.Options();
                //options.inSampleSize = 1;

                bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
            } catch (IOException e) {
                Log.e(TAG, "Could not load Bitmap from: " + url);
            } finally {
                closeStream(in);
                closeStream(out);
            }

            return bitmap;
        }

         private static void closeStream(Closeable stream) {
                if (stream != null) {
                    try {
                        stream.close();
                    } catch (IOException e) {
                        android.util.Log.e(TAG, "Could not close stream", e);
                    }
                }
            }

         private static void copy(InputStream in, OutputStream out) throws IOException {
            byte[] b = new byte[IO_BUFFER_SIZE];
            int read;
            while ((read = in.read(b)) != -1) {
                out.write(b, 0, read);
            }
        }


public class ImageAdapter extends BaseAdapter {
     private Context context;
     TextView txtPicName;
     private ArrayList<HashMap<String, Object>> MyArr = new ArrayList<HashMap<String, Object>>();

     public ImageAdapter(Context c, ArrayList<HashMap<String, Object>> myArrList) 
     {
        // TODO Auto-generated method stub
         context = c;
         MyArr = myArrList;
     } 
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
         return MyArr.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
         return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
         return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);


        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, null); 
        }

        // ColImage
        ImageView imageView = (ImageView) convertView.findViewById(R.id.mImageview_pdf);

         try
         {
             imageView.setImageBitmap((Bitmap)MyArr.get(position).get("imagepath"));
         } catch (Exception e) {
             // When Error
             imageView.setImageResource(android.R.drawable.ic_menu_report_image);
         }



        // ColImgName
        txtPicName = (TextView) convertView.findViewById(R.id.mtextview_title);

        txtPicName.setText(MyArr.get(position).get("name").toString()); 

        Button button1 = (Button) convertView.findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "Clicked", 2).show();
//              downloadPdfContent("http://thetilesofindia.com/magazines/SPECIAL INTERNATIONAL ISSUE - APR-MAY 2013.pdf");
            }
        });

        return convertView;
    }


    public void downloadPdfContent(String urlToDownload){

        try {

            String fileName="xyz";
        String fileExtension=".pdf";

//      download pdf file.

           URL url = new URL(urlToDownload);
           HttpURLConnection c = (HttpURLConnection) url.openConnection();
           c.setRequestMethod("GET");
           c.setDoOutput(true);
           c.connect();
           String PATH = Environment.getExternalStorageDirectory() + "/mydownload/";
           File file = new File(PATH);
           file.mkdirs();
           File outputFile = new File(file, fileName+fileExtension);
           FileOutputStream fos = new FileOutputStream(outputFile);
           InputStream is = c.getInputStream();
           byte[] buffer = new byte[1024];
           int len1 = 0;
           while ((len1 = is.read(buffer)) != -1) {
               fos.write(buffer, 0, len1);
           }
           fos.close();
           is.close();

          System.out.println("--pdf downloaded--ok--"+urlToDownload);
       } catch (Exception e) {
           e.printStackTrace();

       }
}

}