Newbie: ListView crashed App

  • 7 Antworten
  • Letztes Antwortdatum
C

CSharper

Neues Mitglied
0
Hallo,
nachdem ich so einige Apps fürs Windows Phone programmiert habe, sammle ich grade meine ersten Erfahrungen mit Android!

Hier versuche ich eine Listview
PHP:
<ListView
         android:id="@+id/cars_listview"
        android:layout_margin="150dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
mit Objekten meiner Klasse Car zu füllen
PHP:
public class Car {
    /** Property Brand */
    private String _Brand;

    public String getBrand() {
    return _Brand;
}

    public void setBrand(String Brand) {
    if (_Brand != null)
        this._Brand = Brand;
}
    
    
    /** Property Model */
    private String _Model;

    public String getModel() {
        return _Model;
    }

    public void setModel(String Model) {
        if (_Model != null)
            this._Model = Model;
    }

    
    /** Property Milage */
    private int _Milage;

    public int getMilage() {
        return _Milage;
    }

    public void setMilage(int Milage) { 
            this._Milage = Milage;
    }
}
dazu habe ich mir aus einem Tutorial einen BaseAdapter gebastelt
PHP:
public class CarListBaseAdapter extends BaseAdapter {
     private static ArrayList<Car> carDetailsrrayList;
            
     private LayoutInflater l_Inflater;
     
     public CarListBaseAdapter(Context context, ArrayList<Car> results) {
      carDetailsrrayList = results;
      l_Inflater = LayoutInflater.from(context);
     }
     
     public int getCount() {
      return carDetailsrrayList.size();
     }
     
     public Object getItem(int position) {
      return carDetailsrrayList.get(position);
     }
     
     public long getItemId(int position) {
      return position;
     }
     
     public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder;
      if (convertView == null) {
       convertView = l_Inflater.inflate(R.layout.carlistviewtemplate, null);
       holder = new ViewHolder();
       holder.txt_Brand = (TextView) convertView.findViewById(R.id.Brand);
       holder.txt_Model = (TextView) convertView.findViewById(R.id.Model);
       holder.txt_Milage = (TextView) convertView.findViewById(R.id.Milage); 
     
       convertView.setTag(holder);
      } 
      else {
       holder = (ViewHolder) convertView.getTag();
      }
       
      holder.txt_Brand.setText(carDetailsrrayList.get(position).getBrand());
      holder.txt_Model.setText(carDetailsrrayList.get(position).getModel());
      holder.txt_Milage.setText(carDetailsrrayList.get(position).getMilage()); 
     
      return convertView;
     }
     
     static class ViewHolder {
      TextView txt_Brand;
      TextView txt_Model;
      TextView txt_Milage; 
     }
    }
In meiner MainAcrtivity fülle ich eine ArrayList mit meinen Car Objekten.
Und übergebe dieses an meine ListView

PHP:
private ArrayList<Car> initDatensaetze() {
        ArrayList<Car> Collection = new ArrayList<Car>();
         
        for (int i = 0; i < 10; i++) {
            Car c = new Car();
            c.setBrand("Automarke " + i);
            c.setModel("Modell " + i);
            c.setMilage(10 * i);
            Collection.add(c);
            }
        return Collection;
        }

ArrayList<Car> car_details = initDatensaetze();
         
        final ListView lv1 = (ListView) findViewById(R.id.cars_listview);
        lv1.setAdapter(new CarListBaseAdapter(this, car_details));
Dabei haut es mich immer raus.
Hier mal ein Einblick in di Log Datei
01-20 16:33:30.909: E/AndroidRuntime(1030): FATAL EXCEPTION: main
01-20 16:33:30.909: E/AndroidRuntime(1030): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gpsdriverslog/com.gpsdriverslog.MainActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.os.Looper.loop(Looper.java:137)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-20 16:33:30.909: E/AndroidRuntime(1030): at java.lang.reflect.Method.invokeNative(Native Method)
01-20 16:33:30.909: E/AndroidRuntime(1030): at java.lang.reflect.Method.invoke(Method.java:511)
01-20 16:33:30.909: E/AndroidRuntime(1030): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-20 16:33:30.909: E/AndroidRuntime(1030): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-20 16:33:30.909: E/AndroidRuntime(1030): at dalvik.system.NativeStart.main(Native Method)
01-20 16:33:30.909: E/AndroidRuntime(1030): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ListActivity.onContentChanged(ListActivity.java:243)
01-20 16:33:30.909: E/AndroidRuntime(1030): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:273)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.Activity.setContentView(Activity.java:1881)
01-20 16:33:30.909: E/AndroidRuntime(1030): at com.gpsdriverslog.MainActivity.onCreate(MainActivity.java:31)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.Activity.performCreate(Activity.java:5104)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
01-20 16:33:30.909: E/AndroidRuntime(1030): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
01-20 16:33:30.909: E/AndroidRuntime(1030): ... 11 more

kann mir vielleicht jemand weiterhelfen?
Ich habe keine Ahnung und zu wenig Java Erfahrung!
 
Zuletzt bearbeitet:
Im Stack Trace steht das Problem beschrieben: Your content must have a ListView whose id attribute is 'android.R.id.list'

Wenn du von ListActivity ableitest muss deine Liste die ID list haben, deine hat aber die ID cars_listview. So müsste es gehen:
PHP:
<ListView android:id="@android:id/list"
android:layout_margin="150dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
 
meganeura schrieb:
Im Stack Trace steht das Problem beschrieben: Your content must have a ListView whose id attribute is 'android.R.id.list'

Wenn du von ListActivity ableitest muss deine Liste die ID list haben, deine hat aber die ID cars_listview. So müsste es gehen:
PHP:
<ListView android:id="@android:id/list"
android:layout_margin="150dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />


Danke für Deine Hilfe,
das habe ich auch gelesen, konnte aber soweit erstmal nichts damit anfangen.
Weil ich mich noch nicht so mit Android auskenne.

Hmm, also nochmal zusammenfassen!
Wenn ich von ListActivity ableite, dann muss die Anzeigende ListView die ID list beinhalten. Wie sieht es denn jetzt aus wenn ich mehrere ListViews in meiner App habe? Kann ich die ID den mehrfach vergeben? :confused2:

Meine Activity mit der ListView ist eine ganz normale Activity, leitet von Activity ab. Sollte denn eine Activity mit einer ListView immer von ListActivity ableiten? :confused2:

Und zu guter Letzt, wie bekomme ich die Farben in meine Codeansicht? :confused2:
Bei Dir ist der Code schön bunt!

Ich werd Deinen Vorschlag bei nächster Gelegenheit ausprobieren.
 
es macht es etwas einfacher, wenn deine Listenansicht von ListActivity erbt. Ist aber nicht zwingend nötig.

Wenn du mehrere Listen da drin hast (ist das sinnvoll?) dann lass es von Activity erben und du kannst sie benennen wie du willst.
 
CSharper schrieb:
Hmm, also nochmal zusammenfassen!
Wenn ich von ListActivity ableite, dann muss die Anzeigende ListView die ID list beinhalten. Wie sieht es denn jetzt aus wenn ich mehrere ListViews in meiner App habe? Kann ich die ID den mehrfach vergeben? :confused2:
Dann einfach nicht von ListActivity ableiten. ListActivity ist dazu gedacht eine Activity für eine Liste zur Verfügung zu stellen.

Meine Activity mit der ListView ist eine ganz normale Activity, leitet von Activity ab. Sollte denn eine Activity mit einer ListView immer von ListActivity ableiten? :confused2:
Bist du sicher, dass du nicht von ListActivity ableitest? Denn dann kann ich mir den Fehler nicht erklären. Generell würde ich empfehlen ListActivity nicht zu verwenden und stattdessen von Activity abzuleiten.

Und zu guter Letzt, wie bekomme ich die Farben in meine Codeansicht? :confused2:
Bei Dir ist der Code schön bunt!
Ich habe den Tag
PHP:
 verwendet :)
 
Ooops,
Du hattest recht, ich hatte von ListActivity abgeleitet.

Ich habe das ganze nochmal angepasst, aber irgendwie hauts mich immer noch raus. Irgendwas muss ich noch nicht ganz korrekt geproggt haben haben.

01-20 21:38:16.551: E/AndroidRuntime(3561): FATAL EXCEPTION: main
01-20 21:38:16.551: E/AndroidRuntime(3561): android.content.res.Resources$NotFoundException: String resource ID #0x0
01-20 21:38:16.551: E/AndroidRuntime(3561): at android.content.res.Resources.getText(Resources.java:230)
01-20 21:38:16.551: E/AndroidRuntime(3561): at android.widget.TextView.setText(TextView.java:3640)
01-20 21:38:16.551: E/AndroidRuntime(3561): at com.gps_drivers_log.classes.CarListBaseAdapter$ViewHolder.populateFrom(CarListBaseAdapter.java:74)
01-20 21:38:16.551: E/AndroidRuntime(3561): at com.gps_drivers_log.classes.CarListBaseAdapter.getView(CarListBaseAdapter.java:54)


Hier nochmal mein Code in der Activity:
PHP:
public ArrayList<Car> InitCarsCollection()
	{
		ArrayList<Car> cars = new ArrayList<Car>();
		for (int i = 0; i < 11; i++)
		{
			Car car = new Car();
			car.setBrand("Brand " + i);
			car.setModel("Model " + i);
			car.setMilage(10 * i);
			cars.add(car);		
		}
		return cars;
	}
carsCollectionArrayList = InitCarsCollection();
		final ListView lView = (ListView) findViewById(R.id.cars_listview);
		lView.setAdapter(new CarListBaseAdapter(this, carsCollectionArrayList));


der Adapter
PHP:
public class CarListBaseAdapter extends BaseAdapter {
	 private static ArrayList<Car> carDetailsrrayList;
	  	  
	 private LayoutInflater l_Inflater; 
	 
	 public CarListBaseAdapter(Context context, ArrayList<Car> results) {
	  carDetailsrrayList = results;
	  l_Inflater = LayoutInflater.from(context);
	 }
	 
	 public int getCount() {
	  return carDetailsrrayList.size();
	 }
	 
	 public Object getItem(int position) {
	  return carDetailsrrayList.get(position);
	 }
	 
	 public long getItemId(int position) {
	  return position;
	 }
	 
	 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
			Car choosen = carDetailsrrayList.get(position);
	 }
	 
	 public View getView(int position, View convertView, ViewGroup parent) {
	  ViewHolder holder;
	  if (convertView == null) {
	   convertView = l_Inflater.inflate(R.layout.carlist_datatemplate, null);
	   holder = new ViewHolder(convertView);
	   
	 
	   convertView.setTag(holder);
	  } 
	  else {
	   holder = (ViewHolder) convertView.getTag();
	  }
	   holder.populateFrom(position);	    
	 
	  return convertView;
	 }
	 
	 class ViewHolder {
		 public TextView txt_Brand = null;
		 public TextView txt_Model = null;
		 public TextView txt_Milage = null;
		 
		 public ViewHolder(View row)
		{
			   txt_Brand = (TextView)row.findViewById(R.id.Brand);
			   txt_Model = (TextView)row.findViewById(R.id.Model);
			   txt_Milage = (TextView)row.findViewById(R.id.Milage);
		}
		 
		 void populateFrom(int i) {
			 txt_Brand.setText(carDetailsrrayList.get(i).getBrand());
			 txt_Model.setText(carDetailsrrayList.get(i).getModel());
			 txt_Milage.setText(carDetailsrrayList.get(i).getMilage());
		 }
	   
	 }
	}

meine Template view:
PHP:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >    

        <TextView
            android:id="@+id/Brand"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="test"
            android:gravity="center_horizontal" />
        <TextView
            android:id="@+id/Model"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"             
            android:text="test"
            android:layout_marginLeft="150dp"
            android:gravity="center_horizontal" />

        <TextView
            android:id="@+id/Milage"
            android:layout_width="fill_parent"
              android:text="test"
              android:layout_marginTop="50dp"
            android:layout_height="wrap_content" 
            android:gravity="center_horizontal" />
   

</RelativeLayout>

Irgendeine String resource wurde nicht gefunden?!?!
Habe ich etwa eine Verweis auf einen String den ich umbenannt habe?!?!

Es hat auf jeden Fall etwas mit der View im Adapter zu tun,
Wenn ich den Code unten in der Activity auskommentiere läuft die App.
// carsCollectionArrayList = InitCarsCollection();
// final ListView lView = (ListView) findViewById(R.id.cars_listview);
// lView.setAdapter(new CarListBaseAdapter(this, carsCollectionArrayList));
 
Zuletzt bearbeitet:
Wenn Resourcen nicht gefunden werden, obwohl man sicher ist, dass sie da sind, dann hilft oft (in Eclipse) ein Menu>Project>Clean

PS: Übrigens heißt das eigentlich "Mileage" :D
 
Ich glaube ich habe das Problem gefunden.

Hier wird ein ähnliches Problem behandelt:
android - Resources$NotFoundException in ListView - Stack Overflow

Jaja, die Sache mit der Typsicherheit!
Also muss ich meinen Float Value bzw. eine Zahlenvariable erstmal in einen String Value konvertieren.
Sonst meint das SDK ich würde eine id referenzieren.

Ich Danke Euch nochmals für Eure Ratschläge.
Da ich mit C# meine Programmierkenntnisse erarbeitet habe, ist Java für mich zwar gut zu verstehen, aber man muss auch einige Dinge noch mehr "zu Fuss" erledigen als in C#.

Und das Android SDK ist auch etwas anders gestrickt als das Windows Phone SDK. Aber mit etwas Weile und hoffentlich weiterhin guter Unterstützung, sieht das bald wieder ganz anders aus. Wenn man sich erstmal etwas in SDK zurechtfindet, und die Besonderheiten kennen gelernt hat, läufts wie von allein.

Ich bin immer wieder erstaunt, wie viel Hilfsbereitschaft in Foren wie diesen aufgebracht wird.

Der ursprüngliche Beitrag von 09:20 Uhr wurde um 09:25 Uhr ergänzt:

DieGoldeneMitte schrieb:
Wenn Resourcen nicht gefunden werden, obwohl man sicher ist, dass sie da sind, dann hilft oft (in Eclipse) ein Menu>Project>Clean

PS: Übrigens heißt das eigentlich "Mileage" :D

Das werd ich mir auch mal ansehen. Muss wohl erst noch "laufen" lernen mit Eclipse und Android.

Mileage :razz:, ja das wars, hatte auch gezweifelt als ich das Wort geschrieben habe. Habe ich schon mal in einer anderen App richtig geschrieben. Wollte das aber aus Bequemlichkeit nicht googeln.

Mal sehen ob ich es anpasse bevor mein Projekt wächst ;)
 
Zurück
Oben Unten