vendredi 31 juillet 2015

How do I populate an Android GridView with a JSON image Array?

I want to display JSON images in gridview. I will keep all JSON data and the url semi-changed for data-integrity purposes.

I am receiving the logging error:

Could not load image from/images/image.php?w=100....".

I believe that the image information is not being correctly gathered by populate the JSON array, but I am uncertain.

public class JSONImageViewer extends Activity {

  private GridView gridV;
  private ImageAdapter imageAdapter;

  public int currentPage = 1;
  public int TotalPage = 0;

  public Button btnNext;
  public Button btnPre;

  private final static String TAG_IMG = "CarImageLink";

  ArrayList<HashMap<String, Object>> MyArrList = new ArrayList<HashMap<String, Object>>();

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ProgressBar
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

    setContentView(R.layout.activitymain);

    // GridView and imageAdapter
    gridV = (GridView) findViewById(R.id.gridView1);
    gridV.setClipToPadding(false);
    imageAdapter = new ImageAdapter(getApplicationContext());
    gridV.setAdapter(imageAdapter);

    // Next
    btnNext = (Button) findViewById(R.id.btnNext);
    btnNext.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        currentPage = currentPage + 1;
        ShowData();
      }
    });

    // Previous
    btnPre = (Button) findViewById(R.id.btnPre);
    btnPre.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        currentPage = currentPage - 1;
        ShowData();
      }
    });

    // Show first load
    ShowData();

  }

  public void ShowData() {
    btnNext.setEnabled(false);
    btnPre.setEnabled(false);

    setProgressBarIndeterminateVisibility(true);
    new LoadContentFromServer().execute();
  }

  class LoadContentFromServer extends AsyncTask<Object, Integer, Object> {

    @Override
    protected Object doInBackground(Object... params) {

      String url = "http://auto.com";

      // JSONArray data;
      JSONObject data;
      try {

        // data = new JSONArray(getJSONUrl(url));
        data = new JSONObject(getJSONUrl(url));
        JSONArray dataArray = data.getJSONArray("car_images");
        MyArrList = new ArrayList<HashMap<String, Object>>();
        HashMap<String, Object> map;

        /*
         * TotalRows = Show for total rows TotalPage = Show for total page
         */

        int displayPerPage = 9; // Per Page
        int TotalRows = data.length();
        int indexRowStart = ((displayPerPage * currentPage) - displayPerPage);

        if (TotalRows <= displayPerPage) {
          TotalPage = 1;
        } else if ((TotalRows % displayPerPage) == 0) {
          TotalPage = (TotalRows / displayPerPage);
        } else {
          TotalPage = (TotalRows / displayPerPage) + 1;
          TotalPage = (int) TotalPage;
        }
        int indexRowEnd = displayPerPage * currentPage;
        if (indexRowEnd > TotalRows) {
          indexRowEnd = TotalRows;
        }

        for (int i = 0; i < dataArray.length(); i++) {
          map = new HashMap<String, Object>();
          JSONObject c = dataArray.getJSONObject(i);

          // Thumbnail Get ImageBitmap To Object
          Bitmap newBitmap = loadBitmap(c.getString(TAG_IMG));
          map.put(TAG_IMG, newBitmap);

          MyArrList.add(map);
          // publishProgress(i);
        }

      } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      return null;
    }

    @Override
    public void onProgressUpdate(Integer... progress) {
      imageAdapter.notifyDataSetChanged();
    }

    @Override
    protected void onPostExecute(Object result) {

      // Disabled Button Next
      if (currentPage >= TotalPage) {
        btnNext.setEnabled(false);
      } else {
        btnNext.setEnabled(true);
      }

      // Disabled Button Previous
      if (currentPage <= 1) {
        btnPre.setEnabled(false);
      } else {
        btnPre.setEnabled(true);
      }

      setProgressBarIndeterminateVisibility(false); // When Finish
    }
  }

  class ImageAdapter extends BaseAdapter {

    private Context mContext;

    public ImageAdapter(Context context) {
      mContext = context;
    }

    public int getCount() {
      return MyArrList.size();
    }

    public Object getItem(int position) {
      return MyArrList.get(position);
    }

    public long getItemId(int position) {
      return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub

      LayoutInflater inflater = (LayoutInflater) mContext
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

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

      // ColPhoto
      ImageView imageView = (ImageView) convertView.findViewById(R.id.ColPhoto);
      imageView.getLayoutParams().height = 60;
      imageView.getLayoutParams().width = 60;
      imageView.setPadding(5, 5, 5, 5);
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
      try {
        imageView.setImageBitmap((Bitmap) MyArrList.get(position).get(
            "CarImageLink"));
        // Log.v("MyArrList2", MyArrList.toString());
      } catch (Exception e) {
        // When Error
        imageView.setImageResource(android.R.drawable.ic_menu_report_image);
      }

      return convertView;

    }

  }

  /*** 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 *****/
  private static final String TAG = "ERROR";
  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 image 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);
    }
  }
}

Sample array:

{"car_images":[{"id":1,"CarImageID":"4".."CarImageLink:"plk.jpg"....

Any suggestions of why this error is occurring? Because of array population issues? Please explain and show examples relating to my code.

Aucun commentaire:

Enregistrer un commentaire