Bilder in einer LV und FindViewById Nullpointer

  • 10 Antworten
  • Neuester Beitrag
Diskutiere Bilder in einer LV und FindViewById Nullpointer im Android App Entwicklung im Bereich Betriebssysteme & Apps.
K

Krasaf

Neues Mitglied
Hallo Leute,

ich versuche gerade eine ListView zu erstellen, welche ein Bild enthält. Welches Bild es ist wird in der Datenbank gespeichert.
Die ListView ist im Main layout enthalten, doch ich habe noch eine Layout XML Datei die das Layout für jede einzelne Zeile der ListView enthält, diese wird logischerweise nicht mit setContentView eingebunden.

Doch jetzt kommt das Problem. Ich bauche die 2 TextViews und das ImageView aus meiner List Item XML um diese Views mit einem ViewBinder zu füllen. Doch wenn ich mir die Views in der OnCreate mit findViewById holen will dann haben meine Variablen NULL. Wie kann man das lösen ?

Hier mein Code dann sollte es verständlicher werden:

Code:
public class Main extends ListActivity {

	private DbAdapter mDbHelper;
	
	private TextView tvvor;
	private TextView tvnach;
	
	private ImageView imgr;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ringer);
		
		
		ListView lv = getListView();
		lv.setTextFilterEnabled(true);
		
		mDbHelper = new DbAdapter(this);
		mDbHelper.open();
		
	
		tvvor = (TextView) findViewById(R.id.tvvor); //Diese 3 Variablen haben NULL
		tvnach = (TextView) findViewById(R.id.tvnach);
		imgr = (ImageView) findViewById(R.id.image);
		
		
		
		Cursor cur = mDbHelper.fetchAll();
		startManagingCursor(cur);
		
		//Hier wird die LV gefüllt
		
		String[] From = new String[] {DbAdapter.KEY_FIRSTNAME, DbAdapter.KEY_NAME, DbAdapter.KEY_IMAGE };
		int[] To = new int[] {R.id.tvvor, R.id.tvnach, R.id.image};
		
		ListAdapter scur = new SimpleCursorAdapter(this, R.layout.list_item, cur, From, To);;
		((SimpleCursorAdapter) scur).setViewBinder(new SimpleCursorAdapter.ViewBinder() {
			
			@Override
			public boolean setViewValue(View view, Cursor cur, int columnIndex) {
				int viewid = view.getId();

				switch(viewid){
				case R.id.tvvor:
					
					tvvor.setText(cur.getString(cur.getColumnIndex(bAdapter.KEY_FIRSTNAME)));	//Hier kommt dann eine Exception weil tvvor null ist.
					break;
				case R.id.tvnach:
					
					tvnach.setText(cur.getString(cur.getColumnIndex(DbAdapter.KEY_NAME)));
					break;
				case R.id.image:
					
					String img = cur.getString(cur.getColumnIndex(DbAdapter.KEY_IMAGE));
					Uri u = Uri.parse(img);
					imgr.setImageURI(u);
					break;
				}
				
				return true;
			}
		});
		
		lv.setAdapter(scur);
	}	
}

Hier ist die list_items.xml

Code:
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/image"
            android:layout_width="76dp"
            android:layout_height="72dp"
            android:src="@drawable/unbenannt" />

        	<TextView
        	    android:id="@+id/tvvor"
        	    android:layout_width="wrap_content"
        	    android:layout_height="wrap_content"
        	    android:layout_gravity="center"
        	    android:padding="10dp"
        	    android:text="Angela"
        	    android:textSize="16sp" android:textStyle="bold" android:textColor="@color/blue">

			</TextView>

        	<TextView
        	    android:id="@+id/tvnach"
        	    android:layout_width="161dp"
        	    android:layout_height="wrap_content"
        	    android:layout_gravity="center"
        	    android:padding="10dp"
        	    android:text="Merkel"
        	    android:textSize="16sp" 
        	    android:textStyle="bold" 
        	    android:layout_marginLeft="-15dp" 
        	    android:textColor="@color/blue"/>
        
    </LinearLayout>
 
S

swordi

Lexikon
hat deine listview die id
android:id="@android:id/list"
 
K

Krasaf

Neues Mitglied
Also ich habe android:id="@+id/@android:list" drinstehen. Wenn ich aber deine Id verwende, dann funktioniert es auch nicht.
Der Code an sich hat auch funktionert, bevor ich den ViewBinder reingemacht habe. Beim From String hatte ich dann das "DbAdapter.KEY_IMAGE" und beim To String das R.id.image weggelassen, das ohne ViewBinder und es hat funktioniert.

Weis einer vielleicht einen Alternativweg wie ich das lösen könnte ?
 
S

swordi

Lexikon
android:id="@+id/@android:list"

da solltest du eigentlich schon probleme haben, denn es muss android:id="@android:id/list" heißen


vielleicht solltest du das problem mal genauer beschreiben ? du sagst "deine variablen haben null" welche meinst du damit ? zeig mal die logcat ausgaben.

alternativlösung: schreib dir einen custom adapter
 
K

Krasaf

Neues Mitglied
Diese Variablen hatten NULL:

Code:
tvvor = (TextView) findViewById(R.id.tvvor); //Diese 3 Variablen haben NULL
		tvnach = (TextView) findViewById(R.id.tvnach);
		imgr = (ImageView) findViewById(R.id.image);
Jetzt habe ich das Problem jedoch gelöst, wenn auch aus purem Zufall.
Ich hab einfach den Teil mit dem ViewBinder weggelassen und siehe da es geht.
Jetzt brauche ich auch die Variablen nicht zu initialisieren.

Ich weiß nicht warum, aber es klappt mit android:id="@+id/@android:list" bei mir. Ich hatte anfangs etwas Probleme die LV darzustellen und nur mit android:id="@+id/@android:list" hat es geklappt.

Danke für deine Hilfe ;)
 
S

swordi

Lexikon
vielleicht ist android da etwas fehlertollerant.

siehe hier: ListActivity | Android Developers

android:id="@id/android:list" ist korrekt

ich kann dir schon sagen, warum deine member null sind.

du machst ein setcontentview(ringer).
das ist aber das hauptlayout der seite und jenes deiner listeneinträge. der viewbinder arbeitet aber mit dem list_item.xml und von da hast du keine view inflatet => null
 
K

Krasaf

Neues Mitglied
Ja genau das ist das Problem, dass ich die list_item.xml nicht als ContentView habe. Weist du wie man das löst ? Du sagst ich habe die xml nicht inflatet, hilft da der layoutinflater ?
Und ich habe es jetzt in android:id="@id/android:list" geändert und es funktionert ebenfalls. Danke für den Hinweis.
 
S

swordi

Lexikon
naja ich verwende diesen viewbinder eigentlich nicht, da custom adapter für mich wesentlich übersichtlicher sind

aber ich würde mal sagen du bekommst in der setViewValue() eine View, diese ist ja bereits das, was du brauchst.

du holst dir davon die id, und dann hast ein switch über diese id. von daher ist die view ja genau eine dieser textviews.
 
K

Krasaf

Neues Mitglied
Habe grad ausprobiert, was du beschrieben hast und es funktionert. Danke ich habe schon 2 Tage ganz Google danach abgesucht. :thumbup:
 
S

swordi

Lexikon
frag einfach mich :D
 
K

Krasaf

Neues Mitglied
Deinen Namen merk ich mir :D
 
Ähnliche Themen - Bilder in einer LV und FindViewById Nullpointer Antworten Datum
8