2015-09-27 19 views
0

在我的項目中,我想加載url圖像並將它們顯示在gridview活動中。但如何將這些圖像加載到gridview適配器?網格/列表視圖的概念如何將圖像發送到imageitem類

,所以我想了解grid/list view適配器的概念,我的理解。在一個簡單的例子,它包含3個活動:

1 - 主要業務

Useally它包含的定義gridview佈局,方法GridViewAdapter(第三個活動)的定義,在網格視圖中設置適配器。以及要在GridViewAdapter方法中發送的數據或陣列圖像(第二個活動)。

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     gridView = (GridView) findViewById(R.id.gridView); 
     gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData()); 
     gridView.setAdapter(gridAdapter); 
    } 

好的我的問題是什麼方式發送圖像在gridview適配器?

在這個example他們用這種方式,但我不需要TypedArray爲我的項目,實際上邊問題,我什麼時候需要使用它?

private ArrayList<ImageItem> getData() { 
     final ArrayList<ImageItem> imageItems = new ArrayList<>(); 
     TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids); 
     for (int i = 0; i < imgs.length(); i++) { 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1)); 
      imageItems.add(new ImageItem(bitmap, "Image#" + i)); 
     } 
     return imageItems; 
    } 
在另一個 example

他們使用的資源

mItems = new ArrayList<GridViewItem>(); 
Resources resources = getResources(); 

mItems.add(new GridViewItem(resources.getDrawable(R.drawable.aim), getString(R.string.aim))); 
: 
mItems.add(new GridViewItem(resources.getDrawable(R.drawable.youtube), getString(R.string.youtube))); 

在另一個example他們使用的靜態圖像

好吧,我不知道他們是從繪製得到的圖像,但我應該怎麼做在我的活動中顯示它們

- Ill繼續我的解釋ñ櫃面有什麼不對我做

2的ImageItem其另一個活動的地方存儲圖像沒有必要去到它。

3 GridViewAdapter

確定在這裏,我們創建類的構造函數中,我們創建getview方法,進入它之前,我要補充getcount()方法或getitem() 的convertview被用來獲得舊的觀點,持有人保持我猜想的形象。 現在ImageItem是空的,因爲我沒有在主要活動中定義它。那麼該怎麼做?

public class GridViewAdapter extends ArrayAdapter { 
    private Context context; 
    private int layoutResourceId; 
    private ArrayList data = new ArrayList(); 

    public GridViewAdapter(Context context, int layoutResourceId, ArrayList data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ViewHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 
      holder = new ViewHolder(); 
      holder.imageTitle = (TextView) row.findViewById(R.id.text); 
      holder.image = (ImageView) row.findViewById(R.id.image); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     ImageItem item = data.get(position); 
     holder.imageTitle.setText(item.getTitle()); 
     holder.image.setImageBitmap(item.getImage()); 


    Picasso. 
    with(mContext). 
    load(ImageItem .Getimage()) 
    .placeholder(R.drawable.ic_launcher) 
    .fit() 
    .into(holder.imageView); 

     return row; 
    } 

    static class ViewHolder { 
     TextView imageTitle; 
     ImageView image; 
    } 
} 

EDT

//Downloading data asynchronously 
public class AsyncHttpTask extends AsyncTask<String, Void, Integer> { 

    @Override 
    protected Integer doInBackground(String... params) { 
     Integer result = 0; 
     try { 
      // Create Apache HttpClient 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse httpResponse = httpclient.execute(new HttpGet(params[0])); 
      int statusCode = httpResponse.getStatusLine().getStatusCode(); 

      // 200 represents HTTP OK 
      if (statusCode == 200) { 
       String response = streamToString(httpResponse.getEntity().getContent()); 
       parseResult(response); 
       result = 1; // Successful 
      } else { 
       result = 0; //"Failed 
      } 
     } catch (Exception e) { 
      Log.d(TAG, e.getLocalizedMessage()); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     // Download complete. Let us update UI 
     if (result == 1) { 
      mGridAdapter.setGridData(mGridImages); 
      mGridAdapter.notifyDataSetChanged(); 
     } else { 
      Toast.makeText(MainActivity.this, "No Connection found,Check your Connection!", Toast.LENGTH_SHORT).show(); 
     } 
     mProgressBar.setVisibility(View.GONE); 
    } 
} 

String streamToString(InputStream stream) throws IOException { 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream)); 
    String line; 
    String result = ""; 
    while ((line = bufferedReader.readLine()) != null) { 
     result += line; 
    } 

    // Close stream 
    if (null != stream) { 
     stream.close(); 
    } 
    return result; 
} 

/** 
* Parsing the feed results and get the list 
* @param result 
*/ 
private void parseResult(String result) { 
    try { 

     JSONObject response = new JSONObject(result); 
     JSONArray posts = response.optJSONArray("result"); 
     GridImages item; 
     for (int i = 0; i < posts.length(); i++) { 
      JSONObject post = posts.optJSONObject(i); 
      String title = post.optString("name"); 
      String image=post.optString("path"); 
      item = new GridImages(); 
      item.Settitle(title); 
      item.Setimage(image); 
     // JSONArray attachments = post.getJSONArray("attachments"); 
      // if (null != attachments && attachments.length() > 0) { 
      // JSONObject attachment = attachments.getJSONObject(0); 
       // if (attachment != null) 
       // item.Setimage(attachment.getString("url")); 
      //} 
      mGridImages.add(item); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
+0

不應該在對象中使用位圖硬引用。你似乎對android很陌生。您可以在ImageItem中傳遞圖片網址,以創建圖片網址或ID字段。現在,如果圖像來自本地資源,則不需要畢加索。 – subhash

+0

@subhash以上只是示例,我傳遞的iamge作爲URL,我已經存儲在數據庫中的url,但我的問題,如果你能幫助我如何創建一個方法,從數據庫中獲取URL併發送到畢加索。我創建了這樣的方法,但沒有工作 – Moudiz

+0

所以,這個問題是從sqlite重新獲取url,創建ImageItem對象並將它們作爲數組在適配器中傳遞? – subhash

回答

1

你不應該使用位圖的轉接器內,因爲當它在列表視圖或GridView中會消耗大量的內存,並且列表視圖不能回收一次。所以請嘗試使用picasso從url加載位圖或圖像。