2012-04-23 79 views
5

我想創建一個類似android市場的gridview,我想用互聯網上的數據庫中的圖像填充它。它需要使用androidv4.support,因爲我想運行2.2到4.0。如何:gridview裏面的一個片段?

有人說,這是不可能在4.0之前創建一個gridview,這是真的嗎?

但是,它只適用於我使用setListAdapter(),但它每行只顯示一個圖像,如列表視圖,當我更改爲gridview.setAdapter()時,它已經工作了。

這裏是我的嘗試:

這是ListFragment類:

public static class ArrayListFragment extends ListFragment implements OnScrollListener{ 

     ImageAdapter adapter = new ImageAdapter(); 

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


       LayoutInflater gridInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       View v = gridInflater.inflate(R.layout.imagelist, null); 
       GridView gridView = (GridView) v.findViewById(R.id.list); 




      ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT; 
//   ImageAdapter imageAdapter = new ImageAdapter(); 
      adapter.getImageDownloader().setMode(mode); 
      setListAdapter(adapter); 
//   gridView.setAdapter(adapter); 
      getListView().setOnScrollListener(this); 

     } 

這是ImageAdapter類:

public class ImageAdapter extends BaseAdapter { 

      private Context mContext; 

     private final ImageDownloader imageDownloader = new ImageDownloader(); 

      public static int count = 10; 

private final String[] URLS = { 
     "http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg", 
     "http://lh5.ggpht.com/_Z6tbBnE-swM/TB0CryLkiLI/AAAAAAAAVSo/n6B78hsDUz4/s144-c/_DSC3454.jpg", 
     "http://lh3.ggpht.com/_GEnSvSHk4iE/TDSfmyCfn0I/AAAAAAAAF8Y/cqmhEoxbwys/s144-c/_MG_3675.jpg", 
     "http://lh6.ggpht.com/_Nsxc889y6hY/TBp7jfx-cgI/AAAAAAAAHAg/Rr7jX44r2Gc/s144-c/IMGP9775a.jpg", 
     "http://lh3.ggpht.com/_lLj6go_T1CQ/TCD8PW09KBI/AAAAAAAAQdc/AqmOJ7eg5ig/s144-c/Juvenile%20Gannet%20despute.jpg", 
     }; 

      public int getCount() { 
       return count; 
      } 

      public String getItem(int position) { 
       return URLS[position]; 
      } 

      public long getItemId(int position) { 
       return URLS[position].hashCode(); 
      } 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View v; 

       if (convertView == null) { 
        v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null); 
        v.setLayoutParams(new GridView.LayoutParams(200,200)); 

        ImageView imageview = (ImageView)v.findViewById(R.id.image); 
        imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
        imageview.setPadding(6, 6, 6, 6); 
        imageDownloader.download(URLS[position], imageview); 
       } 
      else { 
       v = convertView; 
      } 

       return v; 
      } 

      public ImageDownloader getImageDownloader() { 
       return imageDownloader; 
      } 
    } 

它可能有很大的幫助,如果任何人有一個樣本。由於

回答

8

這應該做工精細,你就不能在ListFragment使用GridView - 只需使用一個普通的老Fragment相反,如果你要手動管理網格反正

另外,點檢查convertView爲null是否執行查看回收 - 操作系統只聲明足夠的視圖來填充屏幕,不再顯示,所以如果您滾動,則可以重新使用視圖,而不必膨脹新視圖。改變你的getView()像這樣利用:

public View getView(int position, View convertView, ViewGroup parent) { 
    View v; 

    if (convertView == null) { 
    v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null); 
    v.setLayoutParams(new GridView.LayoutParams(200,200)); 
    } 
    else { 
    v = convertView; 
    } 

    ImageView imageview = (ImageView)v.findViewById(R.id.image); 
    imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageview.setPadding(6, 6, 6, 6); 
    imageDownloader.download(URLS[position], imageview); 

    return v; 
} 

而且,getView不是BaseAdapter的功能,請嘗試切換而不是ArrayAdapter。作爲一個側面說明,請始終使用@Override當你認爲你覆蓋了基本功能 - 這樣編譯器就會給你一個錯誤,如果你犯了一個錯誤

+0

它的工作原理,但現在它不填充與圖像的gridview,我試圖找到getView的錯誤。 – Marckaraujo 2012-04-23 22:45:42

+0

@Marckaraujo添加了關於GetView的註釋 - 我不知道它是否是您的問題,但它可能有幫助 - URL的來源是哪裏? – JRaymond 2012-04-23 23:00:26

+0

還沒有,我只是更新代碼來顯示URL來自哪裏。 – Marckaraujo 2012-04-24 01:10:21

1

Fragment使用GridView不應該比任何不同在Activity中使用它。我在代碼中看到一個明顯的錯誤,那就是您正在爲onActivityCreated中的佈局充氣,然後立即忽略它。相反,您應該在onCreateView中執行所有視圖初始化操作,方便地提供LayoutInflater供您使用。

至於其目前的行爲,它很有道理,爲什麼它的行爲是如此。我相信ListFragment膨脹包含ListView,如果程序員不提供一個(你目前不是)的佈局。您正在設置的ImageAdapter然後用於將View提供給ListView

因此,將onActivityCreated中的所有代碼移動到onCreateView並且它應該可以工作。你根本不需要重寫onActivityCreated,除非你需要在你的Fragment被連接到Activity時做一些特殊的事情。

至於使用GridView pre 4.0 - GridView自API級別1以來一直存在,所以我敢打賭,在所有Android API級別使用它都很好。

+0

嗯,我真的不知道爲什麼,但我需要使用onActivityCreated,它適用於listview,我也試圖移動到onCreateView然後應用程序崩潰。 – Marckaraujo 2012-04-28 13:39:44