working viewpager sectionspageradapter pageradapter ondestroyview not example android android-pageradapter

android - viewpager - sectionspageradapter in fragment



Android: FragmentPagerAdapter: método getItem llamado dos veces la primera vez (5)

En mi aplicación, he usado el ViewPager. Me gusta,

(say main.xml) <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/register_header" />

Y cree el objeto ViewPager y el objeto ViewPagerAdapter (que extiende FragmentPagerAdapter) en FragmentActivity.

_mViewPager = (ViewPager) findViewById(R.id.viewPager); _adapter = new ViewPagerAdapter(getApplicationContext(), getSupportFragmentManager()); _mViewPager.setAdapter(_adapter);

Y la clase Adaptador es como,

public class ViewPagerAdapter extends FragmentPagerAdapter { private Context _context; private FragmentManager manager; private Fragment f; private String classname="ViewPagerAdapter"; public ViewPagerAdapter(Context context, FragmentManager fm) { super(fm); _context=context; manager=fm; } @Override public Fragment getItem(int position) { Log.i(classname,"getItem called"+position); f = new Fragment(); f=MyFragment.newInstance(); Bundle args = new Bundle(); args.putInt("position", position); f.setArguments(args); return f; } @Override public int getCount() { return User.getPageCount(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } }

Y en la clase MyFragment,

En onResume, tengo que almacenar el objeto wigets a la variable estática común.

public void onResume() { super.onResume(); pageIndex = getArguments().getInt("position"); User.useTextview1=textview1; User.useTextview2= textview2; User.current_pageIndex=pageIndex; }

Tengo que actualizar las vistas de texto obtenidas de la clase Usuario en FragmentActivity. Mi problema es que el método getItem () se llama dos veces la primera vez. De hecho, la vista que se muestra en el emulador es el índice 0, pero obtuvo el primer valor de índice en la actividad FragmentActivity. Si detuve la llamada del método getItem () por segunda vez, puedo obtener la referencia de TextView del índice número 0 en FragmentActivity.

Por favor, dame la mejor manera de hacer esto.

Gracias


Mi problema es que el método getItem () se llama dos veces la primera vez

Este no es el problema, esta es la default feature of FragmentPagerAdapter . Es bueno para usted pasar de esta página a la siguiente y a la anterior.

La vista mostrada en el emulador es el índice 0, pero obtuvo el valor del primer índice en FragmentActivity.

Tengo el mismo problema, y ​​sé por qué. Esto porque used same Fragment in View Pager .

Cómo solucionar esto es separate Fragments by using different Fragment .


Me enfrenté al mismo problema: el método getItem () se llamó dos veces. No sé si su propósito de usar ese método por mío fue activar cambios en una actividad de alojamiento cuando aparece una nueva diapositiva.

Bueno, en primer lugar, getItem () no es un método correcto para obtener un evento de aparición de una nueva diapositiva.

Usé el escucha de ViewPager.OnPageChangeListener en el mismo ViewPager para este propósito. Aquí esta lo que hice:

En la actividad que contiene fragmentos de diapositivas:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.signature_wizard_activity); // Instantiate a ViewPager and a PagerAdapter. mPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { onSlideChanged(position); // change color of the dots } @Override public void onPageSelected(int position) {} @Override public void onPageScrollStateChanged(int state) {} }); }

Se llama a onPageScrolled () cada vez que aparece su diapositiva, como parámetro obtiene la posición actual de la diapositiva que se muestra. Lo bueno es que se llama incluyendo la primera vez que aparece, no solo cuando se cambió la diapositiva.

¿Cuándo se puede utilizar? Por ejemplo, si tiene alguna actividad de asistente con ViewPager en la que desliza fragmentos con algunas sugerencias, probablemente le gustaría tener una barra con puntos grises debajo del control deslizante que representaría el número total de diapositivas, y uno de los puntos será diferente Color que representa la diapositiva actual. En este caso, ViewPager.OnPageChangeListener y el método onPageScrolled () serán la mejor opción.

O si tienes botones PREV. y SIGUIENTE, que cambia las diapositivas y desea desactivar PREV. en la primera diapositiva y desactive el botón SIGUIENTE en la última diapositiva. Aquí es cómo lo haces dentro del método onPageScrolled ():

@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(position == 0){ prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500)); prevBtn.setEnabled(false); }else{ prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue)); prevBtn.setEnabled(true); } if(position == NUM_PAGES -1){ nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500)); nextBtn.setEnabled(false); }else{ nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue)); nextBtn.setEnabled(true); } }

donde NUM_PAGES es una constante con el número total de diapositivas


Puedes usar este método para actualizar tus vistas.

@Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Fetch data or something... } }


en el método getItem escribí esto ...

@Override public Fragment getItem(int index) { EditFragment frag = new EditFragment(); Bundle args = new Bundle(); args.putSerializable("currentItem", itemsList.get(index)); frag.setArguments(args); return (frag); }

aquí itemsList.get (índice) es el objeto de clase modelo que usaré en la clase EditFragment. aqui esta eso

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View result = inflater.inflate(R.layout.pager_fragment_layout, container, false); image = (ImageView)result.findViewById(R.id.pager_image); text = (TextView)result.findViewById(R.id.pager_item_desc); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()).build(); ImageLoader.getInstance().init(config); imLoader = ImageLoader.getInstance(); ****NOTE final SwapItems itemList = (SwapItems) getArguments().getSerializable("currentItem"); imagePath = itemList.getPaths().get(0); imLoader.displayImage(imagePath,image); text.setText(itemList.getItemDescription()); image.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Fragment fragment = new ItemImagesFragment(); FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Bundle bundle = new Bundle(); bundle.putSerializable("val", itemList); fragment.setArguments(bundle); fragmentTransaction.replace(R.id.content_frame, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } }); return result; }

NOTA: aquí obtengo el objeto modelo de swapitems del método getItem anterior es ''final''. esto resuelve mi problema Anteriormente, se inicializó el mismo objeto con estática como modificador.

espero que el tuyo también se aclare


FragmentPagerAdapter crea una instancia de 2 Fragments en el inicio, para el índice 0 y para el índice 1. Si desea obtener datos del Fragment que está en la pantalla, puede usar setOnPageChangeListener para que el Pager obtenga la posición actual. Luego, SparseArray con WeakReference a tus fragmentos. Actualizar esa matriz en la llamada getItem . Cuando se llama a onPageSelected use esa posición para obtener la referencia al Fragment correcto y actualizar los datos del User .

Inicialización de array:

private SparseArray<WeakReference<MyFragment>> mFragments = new SparseArray<WeakReference<MyFragment>>(3);