Bilder in einer LV und FindViewById Nullpointer

K

Krasaf

Neues Mitglied
0
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>
 
hat deine listview die id
android:id="@android:id/list"
 
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 ?
 
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
 
  • Danke
Reaktionen: Krasaf
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 ;)
 
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
 
  • Danke
Reaktionen: Krasaf
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.
 
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.
 
  • Danke
Reaktionen: Krasaf
Habe grad ausprobiert, was du beschrieben hast und es funktionert. Danke ich habe schon 2 Tage ganz Google danach abgesucht. :thumbup:
 
frag einfach mich :D
 
Deinen Namen merk ich mir :D
 

Ähnliche Themen

D
  • Data2006
Antworten
14
Aufrufe
483
jogimuc
J
M
  • MikelKatzengreis
Antworten
5
Aufrufe
114
swa00
swa00
A
Antworten
10
Aufrufe
1.902
swa00
swa00
Zurück
Oben Unten