Android: la pestaña n. ° 3 borra la vista de list de la pestaña n. ° 1.

Tengo un problema realmente extraño que no genera ningún error, por lo que es extremadamente difícil solucionarlo (al less para mí).

Mi aplicación tiene 3 tabs. La pestaña 1 tiene una vista de list dentro de un fragment y las otras dos tabs son básicamente fragments de marcador de position vacíos. Cuando hago clic en la Pestaña 1 y luego en la Pestaña 2, vuelvo a la Pestaña 1, mi vista de list permanece como se esperaba. Sin embargo, si hago clic en la Pestaña 3 y luego hago clic en la Pestaña 1, desaparece la vista de mi list. No veo diferencia entre Tab 2 y Tab 3 que causaría esto.

Agregué el código relacionado de mi aplicación. Por favor, avíseme si se necesita más.

¡Cualquier ayuda y consejo sería muy apreciado!

Mi actividad principal:

var mCursorAdapter: DbCursorAdapter? = null class CatalogActivity : AppCompatActivity(), LoaderManager.LoaderCallbacks<Cursor> { private lateinit var mFragmentPagerAdapter: FragmentPagerAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_catalog) setSupportActionBar(toolbar) // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mFragmentPagerAdapter = FragmentPagerAdapter(supportFragmentManager) // Set up the ViewPager with the sections adapter. view_pager_container.adapter = mFragmentPagerAdapter view_pager_container.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabs)) tabs.addOnTabSelectedListener(TabLayout.ViewPagerOnTabSelectedListener(view_pager_container)) // Setup FAB to open EditorActivity fab_button.setOnClickListener { val intent = Intent(this@CatalogActivity, EditorActivity::class.java) startActivity(intent) } // Kick off the loader loaderManager.initLoader(INGREDIENT_LOADER, null, this) } /** * Helper method to insert hardcoded ingnetworkingient data into the database. For debugging purposes only. */ private fun insertIngnetworkingient() { // Create a ContentValues object where column names are the keys, // and Rittenhouse Rye Whiskey attributes are the values. val values = ContentValues() values.put(IngnetworkingientEntry.COLUMN_INGREDIENT_NAME, "Rittenhouse Rye") values.put(IngnetworkingientEntry.COLUMN_INGREDIENT_DESCRIPTION, "Earthly with a sweet finish.") values.put(IngnetworkingientEntry.COLUMN_INGREDIENT_CATEGORY, IngnetworkingientEntry.CATEGORY_WHISKEY) values.put(IngnetworkingientEntry.COLUMN_INGREDIENT_WEIGHT, 1) // Insert a new row for Rittenhouse Rye Whiskey into the provider using the ContentResolver. // Use the {@link IngnetworkingientEntry#CONTENT_URI} to indicate that we want to insert // into the ingnetworkingients database table. // Receive the new content URI that will allow us to access Rittenhouse's data in the future. contentResolver.insert(IngnetworkingientEntry.CONTENT_URI, values) } /** * Helper method to delete all ingnetworkingients in the database. */ private fun deleteAllIngnetworkingients() { val rowsDeleted = contentResolver.delete(IngnetworkingientEntry.CONTENT_URI, null, null) Log.v("CatalogActivity", rowsDeleted.toString() + " rows deleted from ingnetworkingient database") } override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu options from the res/menu/menu_catalog.xml file. // This adds menu items to the app bar. menuInflater.inflate(R.menu.menu_catalog, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { // User clicked on a menu option in the app bar overflow menu when (item.itemId) { // Respond to a click on the "Insert dummy data" menu option R.id.action_insert_dummy_data -> { insertIngnetworkingient() return true } // Respond to a click on the "Delete all entries" menu option R.id.action_delete_all_entries -> { deleteAllIngnetworkingients() return true } } return super.onOptionsItemSelected(item) } override fun onCreateLoader(i: Int, bundle: Bundle?): Loader<Cursor> { // Define a projection that specifies the columns from the table we care about. val projection = arrayOf(IngnetworkingientEntry._ID, IngnetworkingientEntry.COLUMN_INGREDIENT_NAME, IngnetworkingientEntry.COLUMN_INGREDIENT_DESCRIPTION) // This loader will execute the DbContentProvider's query method on a background thread return CursorLoader(this, // Parent activity context IngnetworkingientEntry.CONTENT_URI, // Provider content URI to query projection, null, null, null)// Columns to include in the resulting Cursor // No selection clause // No selection arguments // Default sort order } override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor) { // Update {@link DbCursorAdapter} with this new cursor containing updated ingnetworkingients data mCursorAdapter?.swapCursor(data) } override fun onLoaderReset(loader: Loader<Cursor>) { // Callback called when the data needs to be deleted mCursorAdapter?.swapCursor(null) } companion object { /** Identifier for the ingnetworkingients data loader */ private val INGREDIENT_LOADER = 0 } } 

Mi Fragmento de Ingnetworkingiente:

 class IngnetworkingientsFragment : Fragment() { override fun onAttach(context: Context?) { super.onAttach(context) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_ingnetworkingient, container, false) } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Set empty view on the ListView, so that it only shows when the ingnetworkingient_list_view has 0 items. ingnetworkingient_list_view.emptyView = empty_view // Setup an Adapter to create a ingnetworkingient_list_view item for each row of ingnetworkingient data in the Cursor. // There is no ingnetworkingient data yet (until the loader finishes) so pass in null for the Cursor. mCursorAdapter = DbCursorAdapter(context, null) ingnetworkingient_list_view.adapter = mCursorAdapter // Setup the item click listener ingnetworkingient_list_view.onItemClickListener = AdapterView.OnItemClickListener { _: AdapterView<*>?, _: View?, _: Int, id: Long -> // Create new intent to go to {@link EditorActivity} val intent = Intent(context, EditorActivity::class.java) // Form the content URI that represents the specific ingnetworkingient that was clicked on, // by appending the "id" (passed as input to this method) onto the // {@link IngnetworkingientEntry#CONTENT_URI}. // For example, the URI would be "content://onCreateDesigns.com.CraftCocktailRecipes.ingnetworkingients/ingnetworkingients/2" // if the ingnetworkingient with ID 2 was clicked on. val currentUri = ContentUris.withAppendedId(DbContract.IngnetworkingientEntry.CONTENT_URI, id) // Set the URI on the data field of the intent intent.data = currentUri // Launch the {@link EditorActivity} to display the data for the current ingnetworkingient. startActivity(intent) } } override fun onDetach() { super.onDetach() } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) } } 

Mi adaptador:

 class FragmentPagerAdapter(fm: FragmentManager) : SmartFragmentStatePagerAdapter(fm) { override fun getItem(position: Int): Fragment { return when (position) { 0 -> IngnetworkingientsFragment() 1 -> RecipesFragment() else -> FavoritesFragment() } } override fun getCount(): Int { // Show 3 total pages. return 3 } } 

Mi Fragmento de Ingnetworkingiente:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="onCreateDesigns.com.CraftCocktailRecipes.IngnetworkingientsFragment"> <ListView android:id="@+id/ingnetworkingient_list_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- Empty view for ingnetworkingient_list_view list --> <RelativeLayout android:id="@+id/empty_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"> <ImageView android:id="@+id/empty_shelter_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/ic_empty_shelter" android:contentDescription="@string/empty_shelter" /> <TextView android:id="@+id/empty_title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/empty_shelter_image" android:layout_centerHorizontal="true" android:fontFamily="sans-serif-medium" android:paddingTop="16dp" android:text="@string/empty_view_title_text" android:textAppearance="?android:textAppearanceMedium"/> <TextView android:id="@+id/empty_subtitle_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/empty_title_text" android:layout_centerHorizontal="true" android:fontFamily="sans-serif" android:paddingTop="8dp" android:text="@string/empty_view_subtitle_text_ingnetworkingients" android:textAppearance="?android:textAppearanceSmall" android:textColor="#A2AAB0"/> </RelativeLayout> 

Creo que es la funcionalidad pnetworkingeterminada de un visor-localizador que en ese momento de configurar el Adaptador de vista-localizador cargue Dos Fragmentos , cuando mueva el fragment 1 a 3, entonces liberará el fragment 1 y viceversa,

si quieres cargar todo el fragment la primera vez que escribir una línea después de setAdapter

 view_pager_container.setOffscreenPageLimit(3); 

setOffscreenPageLimit () este método carga todos tus tres fragments en ese momento o nunca se inicializa de nuevo.

Podría ser útil.

Como interpretar su código no se ha agregado el límite de la página que debe cargarse a cada lado de la página actual.

setOffscreenPageLimit (int)

Puedes probar esta dos solución:

  1. Just aumenta el valor a 2 (es decir, setOffscreenPageLimit (2))
  2. Agregue el código de manipulación de la list que establece el adaptador en el método setUserVisibleHint .

En ViewPager, siempre las páginas actuales, izquierda y derecha (fragment) están activas. cada vez que click la Pestaña 3, ¡se destruirá el fragment de la Pestaña 1! Cuando regrese a la Pestaña 1, se creará nuevamente el fragment en la Pestaña 1.

Además, no veo que se llame a "notifyDataSetChanged ()" en el fragment IngnetworkingViewFragment onViewCreated (). Quiero decir que deberías cargar datos nuevamente desde CursorAdapter.

Aconsejo no cargar todo al mismo time por razones de performance, pero si quieres hacerlo te recomiendo networkingefinir la function getItem () en tu FragmentStatePagerAdapter

Perdón por publicar este ejemplo en Java, pero cuando lo copie y pegue en Android Studio, esto se traducirá automáticamente en el idioma de Kotlin:

 private class MyDataViewPagerAdapter extends FragmentStatePagerAdapter { private MyDataViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case PAGE_ONE: return FragmentOne.newInstance(); case PAGE_TWO: return FragmentTwo.newInstance(); case PAGE_Three: default: return FragmentThree.newInstance(); } } @Override public CharSequence getPageTitle(int position) { switch (position) { case PAGE_ONE: return "PAGE_ONE"; case PAGE_TWO: return "PAGE_ONE"; case PAGE_Three: default: return "PAGE_ONE"; } } @Override public int getCount() { return TOTAL_PAGE_COUNT; } } 

dentro de tu actividad:

utilícelo para vincular TabLyout y View pager:

  // set adapter mPager.setAdapter(mPagerAdapter); tabs.setupWithViewPager(mPager);