0

好吧,所以我想用一個自定義適配器使用網格視圖,4列。我遇到兩個很奇怪的問題Android與GridView的奇怪問題

問題#1:非常奇怪,當它加載時,第1行第1列爲空。然後,當我開始向下滾動時,第一行變爲可見的第一列是空白的。但是當我滾動回到頂部時,顯示的是空白視圖。

問題2:一旦我開始滾動,如果我快速跳到頂部,網格會超出其界限,一旦它滾動到我什麼都看不到的地步,我無法滾動,gridView失去或完全看不見。

我針對的是API 21,所以這是在我的Lolipop設備上,但我已經在kitkat 4.4.2上測試過,並獲得了完全相同的行爲。

這裏是我的GridView佈局/初始化 活動佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <GridView 
     android:id="@+id/gridView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:numColumns="4"/> 

</RelativeLayout> 

活動,初始化的GridView

 ArrayList<AppDetail> appList = getInstalledApps(); 

     AppGridAdapter adapter = new AppGridAdapter(this, android.R.layout.simple_gallery_item, appList); 

     GridView gridView = (GridView)findViewById(R.id.gridView); 
     gridView.setAdapter(adapter); 

AppGridAdapter.java(進口刪除)

public class AppGridAdapter extends ArrayAdapter<AppDetail> { 

    public AppGridAdapter(Context context, int rid, List<AppDetail> list) { 
     super(context, rid, list); 
    } 

    public View getView(int position, View view, ViewGroup parent) { 
     if (view == null) { 
      LayoutInflater inflater = 
        (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.app_grid_item, parent, false); 

      // set width/height = 1/4 parent width 
      int len = parent.getWidth()/4; 
      AbsListView.LayoutParams params = (AbsListView.LayoutParams)view.getLayoutParams(); 
      params.width = len; 
      params.height = len; 
      view.setLayoutParams(params); 

      ViewHolder holder = new ViewHolder(); 
      holder.imgIcon = (ImageView)view.findViewById(R.id.imgAppIcon); 
      holder.tvLabel = (TextView)view.findViewById(R.id.tvAppLabel); 
      view.setTag(holder); 
     } 

     AppDetail app = getItem(position); 

     ViewHolder holder = (ViewHolder)view.getTag(); 

     holder.imgIcon.setImageDrawable(app.icon); 
     holder.tvLabel.setText(app.label); 

     return view; 
    } 

    private static class ViewHolder { 
     ImageView imgIcon; 
     TextView tvLabel; 
    } 
} 

所以你可以看到代碼非常簡單直接。這是我一直用於我的自定義適配器的格式。我不知道它有什麼問題。 任何想法? 謝謝。

+0

您是否試過在調試器(或日誌記錄)中逐步執行代碼並確保'parent.getWidth()'不爲零?似乎這可能是唯一可能的問題。可能在讀取第一個視圖時被稱爲過早。 – blad 2014-12-06 23:42:31

+0

好吧,我假設孩子在這一點上應該膨脹,父母已經膨脹了。但除了少數描述的其他項目都可以正確顯示。 – 2014-12-06 23:48:56

+0

不要緊,你似乎很接近。 – 2014-12-07 01:37:08

回答

0

BTellez是對的。問題在於在膨脹時改變視圖邊界。剛剛刪除該塊,它現在工作。