ListView in Verbindung mit Fixed-Tabs + Swipe

  • 3 Antworten
  • Letztes Antwortdatum
B

bugman

Neues Mitglied
0
Hallo zusammen,

ich bin neu hier im Forum und aber auch erst vor kurzem in die Android-Entwicklung eingesteigen (vorher Java-Erfahrung, das ist aber auch schon etwas her). Nun bin ich auf ein Problem gestoßen, bei dem ich seit Stunden nicht wirklich weiter komme. Vielleicht kann mir hier jemand mal helfen.

Ich habe ein neues Projekt mit "Fixed-Tabs + Swipe" erstellt. Ich habe nun fünf Registerkarten, die ich befüllen will. Ein von diesen wird eine Übersichtsseite und soll unter anderem ein paar Buttons beinhalten. Dies ist kein Problem. Die anderen hingegen sollen Listen anzeigen. In anderen Projekten ohne "Fixed-Tabs" habe ich das über eine ListView auch gut hinbekommen. Dazu findet man im Netz auch genügend Beispiele:

Jetzt ist es aber so, dass durch diese Tabs die Klasse jetzt das Interface "extends Fragments" eingebunden wird. Und hier scheint mein Problem zu sein. ich habe folgendes getestet:

Code:
public class FragmentHeizung extends Fragment {
	
	ListView listView;
	String[] rooms;	
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		     
       listView = (ListView) getActivity().findViewById(R.id.listView1);
        rooms = this.getResources().getStringArray(R.array.roomsArray);
		
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.list_view_rows, R.id.listText, rooms);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new ListClickHandler(getActivity()));
		
		return inflater.inflate(R.layout.fragment_heizung, container, false);
	}

}

Es lässt sich auch ausführen, leider stürzt nach dem Anklicken des entsprechenden Tabs das ganze Programm ab.

Sieht hier ggf. jemand auf den ersten Blick woran dieses liegen kann, bzw. welchen Denkfehler ich hier mache? Bin auch offen für alternative Lösungen.

Danke auf jeden Fall schon mal!
 
Hallo,

als erstes würde ich dir empfehlen mit try catch zu arbeiten, da man dort immer gute Fehlermeldungen bekommt.
Danach würde ich als erstes eine View erzeugen, wie es beim Standard Beispiel der Fall ist und das View per return zurück geben.
Da du dann eine View besitzt kannst du dann auch folgendes verwenden.

Code:
View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
...
ListView listView = (ListView) rootView.findViewById(R.id.listView1);
...
return rootView;

Ich hoffe, wenn du mir try catch arbeitest, bissel was auskommentierst und ein paar Breakpoints setzt, dass du dann den Fehler entdecken wirst.
Falls du das schon gemacht hast, was gibt dir dein LogCat aus?
 
Ja ja, das gute Try Catch. Müsste ich auch mal tatsächlich einbauen... Hab es jetzt aber erst mal mit deinem Tipp und dem Auskommentieren versucht.

Code:
public class FragmentHeizung extends Fragment {
	
	//ListView listView;
	String[] rooms;
	
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		     
		//listView = (ListView) getActivity().findViewById(R.id.listView1);
		View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
		
		rooms = this.getResources().getStringArray(R.array.roomsArray);
		
		
		ListView listView = (ListView) rootView.findViewById(R.id.listView1);
        
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.list_view_rows, R.id.listText, rooms);
        //listView.setAdapter(adapter);
        //listView.setOnItemClickListener(new ListClickHandler(getActivity()));
		
		//return inflater.inflate(R.layout.fragment_heizung, container, false);
        return rootView;
     	}

}


class ListClickHandler implements OnItemClickListener{

	 Context context;
	 
	public ListClickHandler(Context aContext)
	{
		context = aContext;
	}
	
	public void onItemClick(AdapterView<?> Adapter, View view, int position, long arg3)
	{	
		TextView listText = (TextView) view.findViewById(R.id.listText);
		
		String text = listText.getText().toString();
		
		Toast.makeText(context, text + " clicked at postition " + position, Toast.LENGTH_SHORT).show();
	}
	
}


Das Problem scheint er mit den folgenden Zeilen zu haben:

Code:
 //listView.setAdapter(adapter);
        //listView.setOnItemClickListener(new ListClickHandler(getActivity()));


Jedenfalls wenn ich sie auskommentiere läuft er (natürlich ohne gewünschte Funktion) durch. Wenn ich sie drin lasse, bekomme ich im LogCat folgende Fehler:

11-09 06:54:29.728: E/AndroidRuntime(1858): FATAL EXCEPTION: main
11-09 06:54:29.728: E/AndroidRuntime(1858): java.lang.NullPointerException
11-09 06:54:29.728: E/AndroidRuntime(1858): at de.loenne.sethomearduino.FragmentHeizung.onCreateView(FragmentHeizung.java:41)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:490)
11-09 06:54:29.728: E/AndroidRuntime(1858): at de.loenne.sethomearduino.MainActivity.onTabSelected(MainActivity.java:109)
11-09 06:54:29.728: E/AndroidRuntime(1858): at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:572)
11-09 06:54:29.728: E/AndroidRuntime(1858): at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java:1098)
11-09 06:54:29.728: E/AndroidRuntime(1858): at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java:547)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.view.View.performClick(View.java:4240)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.view.View$PerformClick.run(View.java:17721)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.os.Handler.handleCallback(Handler.java:730)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.os.Handler.dispatchMessage(Handler.java:92)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.os.Looper.loop(Looper.java:137)
11-09 06:54:29.728: E/AndroidRuntime(1858): at android.app.ActivityThread.main(ActivityThread.java:5103)
11-09 06:54:29.728: E/AndroidRuntime(1858): at java.lang.reflect.Method.invokeNative(Native Method)
11-09 06:54:29.728: E/AndroidRuntime(1858): at java.lang.reflect.Method.invoke(Method.java:525)
11-09 06:54:29.728: E/AndroidRuntime(1858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-09 06:54:29.728: E/AndroidRuntime(1858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-09 06:54:29.728: E/AndroidRuntime(1858): at dalvik.system.NativeStart.main(Native Method)


Mein Layout (fragment_heizung) sieht wie folgt aus:

Code:
<?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:orientation="vertical"
    android:background="@color/tab_background" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Fragment B"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Heizung"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#FFFFFF" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

Dort kann ich irgendwie auch keinen Fehler entdecken. Wie sieht es bei dir/ euch aus?

Der ursprüngliche Beitrag von 13:01 Uhr wurde um 13:08 Uhr ergänzt:

Ahhhh ich bin aber auch ein Trottel... Der Fehler war natürlich hier:

Code:
View rootView = inflater.inflate(R.layout.fragment_heizung, container, false);

Man sollte auch das richtige Layout auswählen.

Trotzdem Danke für deine Hilfe! Ich werde sicherlich noch mal darauf zurückkommen. :)
 
Es freut mich, dass ich dir etwas helfen konnte.
 
Zurück
Oben Unten