- Forum-Beiträge: 14
22.04.2014, 17:52:28 via Website
22.04.2014 17:52:28 via Website
Hallo,
ich habe einen NavigationDrawer. Wenn man auf einen Eintrag ("Personen") in diesem klickt, soll ein ViewPager geöffnet werden. Dabei sollen die Personen - je nach Tab - unterschiedlich sortiert werden. Soweit so gut.
Folgendermaßen habe ich das aufgrunddessen aufgebaut:
- Activity-Klasse die den NavigationDrawer beinhaltet und das Handling macht zu dem "Personen"-Eintrag macht
- "Personen"-Fragment die den ViewPager beinhaltet, und einen PagerAdapter (bzw. FragmentStatePagerAdapter) zuweist
- Der PagerAdapter hat dann das Fragment, welche im jeweiligen Tab angezeigt werden soll. Nachdem nur die Sortierung unterschiedlich ist, existiert dafür nur ein ListFragment
- Dieses ListFragment implementiert die LoaderCallbacks des LoaderManagers (LoaderManager .LoaderCallbacks), und erzeugt einen SimpleCursorLoader (je nach Sortierung würde ein untersch. Cursor zurückgegeben werden)
Meine Fragen:
- Problem: Ab und an bleiben die Listen im ViewPager ("Personen") leer - woran kann das liegen?
- Gibt es einen besseren Aufbau/Struktur? - Wie würde das aussehen? Ist der CursorLoader hier überhaupt ideal (benötige ein Suchfeld, deswegen hätte ich diesen verwendet - ist aber noch nicht implementiert)
- Aufgrund der verwendeten Klassen (zB FragmentStatePagerAdapter) muss ich auf die Support Lib v4 setzen - ist das klug? - Die Applikation wurde für Android v. 4+ spezifziert.
Code:
Der Aufruf in der HauptActivity des Fragments, welche den ViewPager beinhaltet:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, new PersonFragment()).addToBackStack("person")
.commit();
Das zugehörige PersonFragment sieht wie folgt aus:
public class PersonFragment extends Fragment {
private ViewPager mViewPager;
private View view;
public PersonFragment () {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.person_fragment, container, false);
PagerAdapter mPageAdapter = new PagerAdapter(getFragmentManager());
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mViewPager.setAdapter(mPageAdapter);
return view;
}
Der PagerAdapter:
public class PagerAdapter extends FragmentStatePagerAdapter {
private final String[] titles = { "Sortierung1", "Sortierung2", "Sortierung3, "Sortierung4", "Sortierung5" };
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public android.support.v4.app.Fragment getItem(int position) {
return new PersonListFragment ();
}
@Override
public int getCount() {
return 5;
}
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
Das PersonListFragment:
public class PersonListFragment extends ListFragment implements LoaderManager
.LoaderCallbacks<Cursor> {
private AbsListView listview;
private CursorAdapter mAdapter;
public final class PersonCursorAdapter extends CursorAdapter {
public PersonCursorAdapter (Context context, Cursor c, int flags) {
super(context, c, flags);
}
public PersonCursorAdapter (Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return inflater.inflate(R.layout.list_item_person, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String name = cursor.getString(cursor.getColumnIndex("name"));
TextView txt_contactName = (TextView) view.findViewById(R.id.contactName);
txt_contactName.setText(surname + " " + name);
//TBD - e.g. Image
}
}
public PersonListFragment() { }
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
mAdapter = new PersonCursorAdapter(getActivity().getApplicationContext(), null, true);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_person_list, container, false);
listview = (AbsListView) view.findViewById(android.R.id.list);
return view;
}
private void restartLoader() {
getLoaderManager().restartLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bargs) {
return new PersonLoader(getActivity().getApplicationContext());
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
public class PersonLoader extends SimpleCursorLoader {
public ContactLoader(Context context) {
super(context);
}
@Override
public Cursor loadInBackground() {
return new PersonBO(getContext()).getPersonCursor();
}
}
Ich bin über jede Hilfe sehr dankbar! Danke!
Liebe Grüße!
— geändert am 22.04.2014, 17:56:47
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.