学习GridView

问题描述:

我的活动,当我尝试打开所述活动时显示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。 –

你传递一个未初始化数组列表插入适配器,所以它的空,抛出构造中的错误当你得到列表的大小

你应该在设置适配器之前调用loadApps方法。或者让它返回数组列表,并将该方法传递给适配器。

另外值得一提的是,您可以扩展ArrayAdapter<AppDetails>而不是BaseAdapter,或者您应该完成BaseAdapter的实现,getItem方法不会返回null。如果您稍后想要访问适配器的元素。

您也可以将arraylist保留在适配器中。无需转换为数组

+0

我已经将loadApps方法放在适配器,但它仍然崩溃,无论如何,我会学习ArrayAdapter,可能会解决我的问题。感谢您指出错误。 – iamLinker

+0

那么,没有堆栈跟踪,很难知道实际的错误。我刚刚写下了我看到的第一张 –