学习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>
你传递一个未初始化数组列表插入适配器,所以它的空,抛出构造中的错误当你得到列表的大小
你应该在设置适配器之前调用loadApps方法。或者让它返回数组列表,并将该方法传递给适配器。
另外值得一提的是,您可以扩展ArrayAdapter<AppDetails>
而不是BaseAdapter,或者您应该完成BaseAdapter的实现,getItem
方法不会返回null。如果您稍后想要访问适配器的元素。
您也可以将arraylist保留在适配器中。无需转换为数组
我已经将loadApps方法放在适配器,但它仍然崩溃,无论如何,我会学习ArrayAdapter,可能会解决我的问题。感谢您指出错误。 – iamLinker
那么,没有堆栈跟踪,很难知道实际的错误。我刚刚写下了我看到的第一张 –
在您的LinearLayout中,请尝试添加android:context =“。AppContainerActivity” –
请提供猫日志 – ddb
使用回收站和GridLayoutManager而不是GridView。 –