2016-07-28 111 views
-1

我的活動,當我嘗試打開所述活動時顯示GridView崩潰。對於我的代碼有什麼問題,我有點無知,請幫助我解決這個問題。學習GridView

public class AppContainerActivity extends Activity { 

private PackageManager manager; 
public List<AppDetails> apps; 
GridView AppDrawer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_app_container); 

    AppDrawer = (GridView) findViewById(R.id.AppDrawer); 
    AppDrawer.setAdapter(new ItemAdapter(this, apps)); 

} 

//Fetch installed apps on device 
public void loadApps(){ 
    manager = getPackageManager(); 
    apps = new ArrayList<AppDetails>(); 

    Intent getApp = new Intent(Intent.ACTION_MAIN,null); 
    getApp.addCategory(Intent.CATEGORY_LAUNCHER); 

    List<ResolveInfo> availableActivities = manager.queryIntentActivities(getApp, 0); 
    for(ResolveInfo ri : availableActivities){ 
     AppDetails app = new AppDetails(); 
     app.appIcon = ri.activityInfo.loadIcon(manager); 
     apps.add(app); 
    } 
} 

} 

ItemAdapter:

class ItemAdapter extends BaseAdapter { 

Context mContext; 
Integer[] icon; 
ItemAdapter(Context c, List<AppDetails> apps){ 
    mContext = c; 
    icon = apps.toArray(new Integer[apps.size()]); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return icon.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    ImageView appIcon; 
    if(convertView == null) { 
     appIcon = new ImageView(mContext); 
     appIcon.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     appIcon.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     appIcon.setPadding(8, 8, 8, 8); 
    } else { 
     appIcon = (ImageView) convertView; 
    } 
    appIcon.setImageResource(icon[position]); 

    return appIcon; 
} 

} 

AppDetails:

class AppDetails { 
    Drawable appIcon; 
} 

XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:gravity="center" 
android:orientation="vertical" > 

<GridView 
    android:id="@+id/AppDrawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:numColumns="auto_fit" 
    android:columnWidth="70dp" 
    android:horizontalSpacing="10dp" 
    android:verticalSpacing="10dp" 
    android:scrollbars="horizontal" 
    android:stretchMode="spacingWidthUniform" 
    /> 

</LinearLayout> 
+0

在您的LinearLayout中,請嘗試添加android:context =「。AppContainerActivity」 –

+0

請提供貓日誌 – ddb

+1

使用回收站和GridLayoutManager而不是GridView。 –

回答

0

你傳遞一個未初始化數組列表插入適配器,所以它的空,拋出構造中的錯誤當你得到列表的大小

你應該在設置適配器之前調用loadApps方法。或者讓它返回數組列表,並將該方法傳遞給適配器。

另外值得一提的是,您可以擴展ArrayAdapter<AppDetails>而不是BaseAdapter,或者您應該完成BaseAdapter的實現,getItem方法不會返回null。如果您稍後想要訪問適配器的元素。

您也可以將arraylist保留在適配器中。無需轉換爲數組

+0

我已經將loadApps方法放在適配器,但它仍然崩潰,無論如何,我會學習ArrayAdapter,可能會解決我的問題。感謝您指出錯誤。 – iamLinker

+0

那麼,沒有堆棧跟蹤,很難知道實際的錯誤。我剛剛寫下了我看到的第一張 –