Función de parada que llama en pestañas

Tengo 3 lengüetas de los golpes (A, B, C) en mi androide. Cuando viene a las lengüetas c, tengo una función RetrieveData() , usada para recuperar los datos de MySQL y la carga en listView .

Suponga que en MySQL sólo tengo una fila de datos, cuando viene a c, los datos se cargan en listView (una lista solamente). Cuando pase a la pestaña A y pase a C de nuevo, la lista se convierte en 2 ahora. ¿Hay una manera que puedo hacer que el RetrieveData() sólo llame una vez? Gracias.

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View edit_details = inflater.inflate(R.layout.edit_work_details, container, false); // EditDetails = new ArrayList<HashMap<String, String>>(); listViewUpdate = (ListView) edit_details.findViewById(R.id.listViewEdit); totalHours=(TextView)edit_details.findViewById(R.id.hour); setHasOptionsMenu(true); Bundle bundle = this.getArguments(); if (getArguments() != null) { ID = bundle.getString("ID"); RetrieveData(ID); // retrieve data from MySQL } Toast.makeText(getActivity(), "Details" + ID, Toast.LENGTH_LONG).show(); } 

TabAdapter

 public class TabsFragmentPagerAdapter extends FragmentPagerAdapter { public TabsFragmentPagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public Fragment getItem(int index) { // TODO Auto-generated method stub if(index == 0) { Fragment fragment=new A(); Bundle bundle = new Bundle(); bundle.putString("ID", Edit.ID); fragment.setArguments(bundle); return fragment; } if(index == 1) { Fragment fragment = new B(); Bundle bundle = new Bundle(); bundle.putString("ID", Edit.ID); fragment.setArguments(bundle); return fragment; } if(index == 2) { Fragment fragment = new C(); Bundle bundle = new Bundle(); bundle.putString("ID", Edit.ID); fragment.setArguments(bundle); return fragment; } return null; } @Override public int getCount() { // TODO Auto-generated method stub return 3; } } 

Código de ViewPager

 public class ActivityB extends ActionBarActivity implements ActionBar.TabListener { private ViewPager viewPager; private ActionBar actionBar; private TabsFragmentPagerAdapter tabsAdapter; private String[] item = new String[]{"Information","Work Force","Work Details"}; private String id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); // id=getIntent().getExtras().getString("ID"); viewPager = (ViewPager) findViewById(R.id.viewPager); tabsAdapter = new TabsFragmentPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(tabsAdapter); actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); for(int i=0; i<4; i++){ actionBar.addTab(actionBar.newTab().setText(item[i]).setTabListener(this)); } viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg) { // TODO Auto-generated method stub actionBar.setSelectedNavigationItem(arg); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } @Override public void onTabReselected(ActionBar.Tab arg0, FragmentTransaction arg1) { // TODO Auto-generated method stub } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction arg1) { // TODO Auto-generated method stub viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab arg0, FragmentTransaction arg1) { // TODO Auto-generated method stub } } 

Esta es mi pestaña c

Introduzca aquí la descripción de la imagen

Después de deslizar a A y C de nuevo

Introduzca aquí la descripción de la imagen

Parece que llama a RetrieveData nuevo.

Debe utilizar setOffscreenPageLimit de ViewPager . Establecerá cuántas páginas de pager desea cargar al principio.

El valor por defecto para setOffScreeenPageLimit es 1, por lo que se carga la página actual y la siguiente. En su caso cargará A y B , cuando se mueva a C desde B destruirá la instancia de A

Intenta usar

 `pager.setOffscreenPageLimit(2)` 

Cargará la página actual y 2 páginas más para que A, B y C se carguen una vez.

EDITAR

Establezca el número de páginas que deben conservarse en cualquier lado de la página actual en la jerarquía de vistas en un estado inactivo. Las páginas más allá de este límite se recrearán desde el adaptador cuando sea necesario.

Esto se ofrece como una optimización. Si conoce de antemano el número de páginas que necesitará para soportar o tiene mecanismos de carga por descarga en sus páginas, modificar esta configuración puede tener beneficios en la suavidad percibida de las animaciones de paginación y la interacción. Si tiene un número pequeño de páginas (3-4) que puede mantener activas todas a la vez, se gastará menos tiempo en el diseño para los subárboles de vista recién creados que las páginas de usuario de un lado a otro.

Fuente

Esto significa claramente que puede establecer el número de páginas que desea cargar en el nivel inicial, si desea cargar 5 páginas en la primera ejecución, establezca su valor en 4.

Ahora si va a pasar de cualquiera de las páginas entre 5 páginas, onCreateView() de Fragment no será llamado, ya que ya está cargado en la etapa inicial.

Si está recuperando desde el DB cada vez que pasa a C , entonces necesita borrar la lista antes de mano, ya sea en el método onResume cuando ingresa el fragmento o en el método onPause cuando abandona el fragmento.

Esto significa que bien elimine su ArrayList por ejemplo, y asegúrese de que no es static , o bien significa que tiene que borrar su ListView utilizando listView.setAdapter(null); . Entonces no se olvide de usar notififyDatasetChanged() en el adaptador.

Puesto que usted no ha pegado su código de RetrieveData (), asumo que usted lee los datos en un ArrayList <> o itera sobre el cursor. Y también no hay otros lugares donde usted está llamando a este método except onCreateVie (). Algunas de las posibles soluciones pueden ser:

  1. Si está estableciendo explícitamente viewPager.setOffscreenPageLimit (x), donde x> 1, quite ese código. Por defecto, este valor es 1 y ver llamadas de pager createView cada vez.
  2. Como usted está utilizando FragmentPagerAdapter, una vez que haya cargado su fragmento C idealmente, no debe ser creado de nuevo, ya que debe estar presente en la memoria y ViewPager se utiliza that.Check si su onCreateView () se llama cada vez para el fragmento C .
  3. Por favor, asegúrese de que al recuperar sus datos en una lista cada vez, no se agrega en la lista en lugar de borrar la lista y luego agregarla.

Por favor, intente arriba.

Muchas respuestas sugieren setOffscreenPageLimit pero no lo recomendaría por 2 razones.

1) Los recursos de un fragmento en viewpager no serán recogidos de la basura incluso si está fuera de pantalla. Esto causará problemas de memoria en caso de que tenga objetos tomando memoria como bitmaps.

2) Este enfoque no será suficiente cuando la aplicación va a fondo y viene a primer plano de nuevo.

Sugiero guardar sus datos en onSaveInstanceState en cada fragmento en su ViewPager y comprobar si hay un dato guardado en onCreate. Si hay datos, muéstrelos. De lo contrario, consulte los datos.

Me he enfrentado a un problema similar en algún momento atrás, el problema fue con mi código, en la búsqueda de la fecha de la base de datos, estaba poblando la lista, y cada vez que la página se actualiza no va a crear una nueva lista, fue directamente la adición de los mismos datos en la lista que Ya contiene los datos y muestra dos filas con la misma entrada. Para solucionar este problema, he borrado mi lista antes de rellenar los datos.

Puede evitarlo estableciendo OffscreenPageLimit en 2 en su instancia de ViewPager . Aquí está la documentación –

 /** * Set the number of pages that should be retained to either side of the * current page in the view hierarchy in an idle state. Pages beyond this * limit will be recreated from the adapter when needed. * * <p>This is offered as an optimization. If you know in advance the number * of pages you will need to support or have lazy-loading mechanisms in place * on your pages, tweaking this setting can have benefits in perceived smoothness * of paging animations and interaction. If you have a small number of pages (3-4) * that you can keep active all at once, less time will be spent in layout for * newly created view subtrees as the user pages back and forth.</p> * * <p>You should keep this limit low, especially if your pages have complex layouts. * This setting defaults to 1.</p> * * @param limit How many pages will be kept offscreen in an idle state. */ public void setOffscreenPageLimit(int limit) { if (limit < DEFAULT_OFFSCREEN_PAGES) { Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES); limit = DEFAULT_OFFSCREEN_PAGES; } if (limit != mOffscreenPageLimit) { mOffscreenPageLimit = limit; populate(); } } 
  • Aplicación de Android con ActionBar NullPointerException con configuración regional no predeterminada
  • Android: pestañas en la parte inferior de la pantalla
  • Comparando La compatibilidad de la barra de acción de Android, el buscapersonas y las pestañas de muestra a ActionBarSherlock
  • carga diferentes actividades en pestañas
  • Cómo crear estilo tabulado de Android con la vista de desplazamiento de página
  • El tipo ActionBar.Tab está obsoleto
  • Android - ¿Cómo puedo localizar el indicador de pestañas entre las dos pestañas TextViews?
  • TabHost definido en el diseño está dando NullPointerException durante setContent
  • La tecla Tab no funciona en Android Studio
  • ¿ActionBarSherlock permite activar / desactivar un ActionBar.Tab?
  • El contenido de Tabhost no se muestra cuando actualizo android.support.v4
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.