2016-07-28 31 views
-1

Meine Aktivität, die die GridView anzeigt, stürzt ab, wenn ich versuche, die genannte Aktivität zu öffnen. Ich habe keine Ahnung, was mit meinen Codes nicht stimmt, bitte hilf mir dabei.Learning 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-Layout:

<?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

In Ihrem LinearLayout versuchen Sie, android: context = ". AppContainerActivity" –

+0

geben Sie bitte Cat-Protokolle – ddb

+1

Verwenden Sie einen Recycler und GridLayoutManager anstelle einer GridView. –

Antwort

0

Sie übergeben eine nicht initialisierte Arraylist in den Adapter, so dass es für null und ein Wurf Fehler im Konstrukt wenn Sie die Größe der Liste erhalten

Sie sollten die LoadApps-Methode aufrufen, bevor Sie den Adapter festlegen. Oder bringen Sie die Arraylist zurück und übergeben Sie diese Methode an den Adapter.

Zusätzlich erwähnenswert, können Sie eine ArrayAdapter<AppDetails> anstelle eines BaseAdapter erweitern, oder Sie sollten die Umsetzung des BaseAdapter mit der getItem Methode nicht Rückkehr null abzuschließen. Falls Sie später auf Elemente des Adapters zugreifen wollen.

Sie könnten auch die Arraylist im Adapter behalten. Keine Notwendigkeit, in ein Array zu konvertieren

+0

Ich habe bereits die loadApps-Methode vor der Adapter, aber es stürzt immer noch ab, trotzdem werde ich ArrayAdapter studieren, könnte meine Probleme lösen. Danke, dass Sie auf die Fehler hingewiesen haben. – iamLinker

+0

Nun, ohne den Stacktrace ist es schwierig, den tatsächlichen Fehler zu kennen. Ich habe gerade den ersten aufgeschrieben, den ich gesehen habe –