2014-10-31 77 views
0

我從日誌中獲得了json webservice的圖像路徑。我使用hashmap在jQuery中使用listview顯示圖像。但不能在列表視圖中顯示任何圖像。以下是我的源代碼。如何使用Hashmap從JSON webservice獲取並顯示縮略圖圖像?

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

} 

下面是佈局文件,該文件有列表視圖

<?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> 
+0

我想,你需要的東西不能用簡單的適配器來完成。你需要自己的自定義適配器。一個將擴展'BaseAdapter'的類。嘗試在'listview with custom adapter'上搜索,你可能會遇到一些有用的東西。 – DroidDev 2014-10-31 08:46:47

+0

嘗試使用AQuery從url下載圖片check:http://code.google.com/p/android-query/ – 2014-10-31 09:01:56

+0

我用http://www.wingnity.com/blog/android-json-parsing-and -image-loading-tutorial /創建自定義適配器但沒有成功 – jack 2014-10-31 09:42:33

回答

0

用來幹什麼的R地段& 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(); 

     } 
} 

}