ActionBar y ViewPager y CursorLoader funciona, pero tal vez hay mejor manera
Mi aplicación carga datos de la base de datos (ContentResolver) y crea pestañas en ActionBar con ViewPager. El código siguiente funciona como se esperaba, pero quiero que alguien revise mi código. Necesito saber si cumple con los patrones generales y las prácticas? ¿Necesita un cambio? ¿Puedo obtener algunas opiniones?
public class MainActivity extends SherlockFragmentActivity { private static final String TAG = MainActivity.class.getSimpleName(); TabAdapter tabAdapter; ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tabAdapter = new TabAdapter(getSupportFragmentManager()); viewPager = (ViewPager) findViewById(R.id.viewpager); viewPager.setAdapter(tabAdapter); final ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); } }); } private class TabAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, LoaderManager.LoaderCallbacks<Cursor> { ArrayList<String> lists = new ArrayList<String>(); ArrayList<Fragment> fragments = new ArrayList<Fragment>(); public TabAdapter(FragmentManager fragmentManager) { super(fragmentManager); getSupportLoaderManager().initLoader(0, null, this); } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public Fragment getItem(int arg0) { return fragments.get(arg0); } @Override public int getCount() { return fragments.size(); } @Override public CharSequence getPageTitle(int position) { return lists.get(position); } @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { CursorLoader cursorLoader = new CursorLoader( MainActivity.this, TasksContentProvider.TaskLists.CONTENT_URI, null, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor c) { while (c.moveToNext()) { String title = c.getString(c.getColumnIndex(TasksContentProvider.TaskLists.Columns.TITLE)); lists.add(title); TaskListFragment fragment = new TaskListFragment(); Bundle bundle = new Bundle(); bundle.putInt("LIST_ID", c.getInt(c.getColumnIndex(TasksContentProvider.TaskLists.Columns._ID))); fragment.setArguments(bundle); fragments.add(fragment); final ActionBar actionBar = getSupportActionBar(); actionBar.removeAllTabs(); for (int i = 0; i < getCount(); i++) { actionBar.addTab(actionBar.newTab().setText(getPageTitle(i)).setTabListener(this)); } } } @Override public void onLoaderReset(Loader<Cursor> arg0) { } } }
- Desplazamiento no funciona en android ViewPager con FragmentPagerAdapter
- SetCurrentItem en ViewPager no se desplaza inmediatamente en la posición correcta
- Hacer ViewPager rápido con la resistencia más corta
- ViewPager y OnItemClickListener en ListView
- Cómo evitar que viewpager inicialice la vista siguiente de forma predeterminada en android?
- Android ViewPager + Webview, ClassCastException! Necesita una vista web en un viewpager
- ViewPager con FragmentPagerAdapter no se muestra
- Intentar invocar el método virtual 'void android.support.v4.view.ViewPager.setAdapter (android.support.v4.view.PagerAdapter)' en una referencia de objeto nulo
- PagerAdapter.notifyDataSetChanged no actualiza fragmentos
- ¿Cuándo debería getItemPosition considerar cambios en la posición de un ítem?
- Reposición / margen de ViewPager de Android entre fragmentos de página
- Texto en PagerTabStrip no se muestra en la primera vista
- Android.content.res.Resources $ NotFoundException: No se puede encontrar el recurso ID # 0xffffffff
Eso depende completamente de su diseño. Si está dispuesto a usar SherlockActionBar entonces es probable que dependa de diseño / código de alguien más. Sin embargo, usted puede encontrar muchos exmaples y tutoriales de cómo hacer uso de SherlockActionbar. Sin embargo, encontrará que hay muchos nuevos módulos que se pueden utilizar para crear funcionalidad similar a la de ActionbarSherlock. Echa un vistazo al siguiente enlace para encontrar nuevas características en las bibliotecas v4 y v7,
http://developer.android.com/tools/support-library/index.html
Pocas sugerencias sobre la estructuración de código. Trate de modularizar su código, aunque a partir de ahora es legible. Espero que esto ayude.
Estoy utilizando mFragmentStatePageAdapter.notifyDataSetChanged()
; en onLoadFinished(Loader<Cursor> loader, Cursor data)
para notificar los cambios de datos, y si mueve la parte del cargador del cursor a MainActivity
, también funciona. personalmente prefiero no implementar el cargador del cursor en el adaptador.