1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Bilder in einer LV und FindViewById Nullpointer

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Krasaf, 05.11.2011.

  1. Krasaf, 05.11.2011 #1
    Krasaf

    Krasaf Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2011
    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>
     
  2. swordi, 05.11.2011 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hat deine listview die id
    android:id="@android:id/list"
     
  3. Krasaf, 06.11.2011 #3
    Krasaf

    Krasaf Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2011
    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 ?
     
  4. swordi, 06.11.2011 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
    Krasaf bedankt sich.
  5. Krasaf, 06.11.2011 #5
    Krasaf

    Krasaf Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2011
    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 ;)
     
  6. swordi, 06.11.2011 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
    Krasaf bedankt sich.
  7. Krasaf, 06.11.2011 #7
    Krasaf

    Krasaf Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2011
    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.
     
  8. swordi, 06.11.2011 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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.
     
    Krasaf bedankt sich.
  9. Krasaf, 06.11.2011 #9
    Krasaf

    Krasaf Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2011
    Habe grad ausprobiert, was du beschrieben hast und es funktionert. Danke ich habe schon 2 Tage ganz Google danach abgesucht. :thumbup:
     
  10. swordi, 06.11.2011 #10
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    frag einfach mich :D
     
  11. Krasaf, 06.11.2011 #11
    Krasaf

    Krasaf Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    23.07.2011
    Deinen Namen merk ich mir :D
     

Diese Seite empfehlen