Sé que hay algunos temas acerca de esto aquí, pero ya no se pudo encontrar una solución que me podría llegar a trabajar para mi caso.

Tengo un trabajo de deslizamiento de la galería utilizando una costumbre FragmentActivity y FragmentPagerAdapter que contiene una lista de los Fragmentos.

Dentro de la FragmentActivity es un ImageView «eliminar». Si se hace clic, la función deleteMedia() se llama que entonces debería eliminar el actual Fragment y el siguiente Fragment debe ser mostrado.
¿Cómo puedo hacer que en mi ejemplo?

FragmentActivity:

public class GalleryPagerActivity extends FragmentActivity implements OnClickListener {
private Intent intent;
private SharedPreferences settings;
private PagerAdapter mPagerAdapter;
private ViewPager mPager;
private List<Fragment> fragments;
private List<WhiteboardMedia> wiList;
private int selectedPosition;
private LinearLayout llTop;
private TextView tvTop;
private ImageView delete;
private ImageView share;
private TextView tvCounter;
private TextView tvFilename;
private TextView tvFilesize;
private TextView tvDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
super.setContentView(R.layout.gallery_pager);
intent = getIntent();
Type collectionType = new TypeToken<List<WhiteboardMedia>>(){}.getType();
wiList = gson.fromJson(intent.getStringExtra("wiList"), collectionType);
selectedPosition = intent.getIntExtra("position", 1);
llTop = (LinearLayout) findViewById(R.id.llTop);
llTop.setOnClickListener(this);
tvTop = (TextView) findViewById(R.id.tvTop);
tvTop.setOnClickListener(this);
delete = (ImageView) findViewById(R.id.imgDelete);
delete.setOnClickListener(this);
share = (ImageView) findViewById(R.id.imgShare);
share.setOnClickListener(this);
tvCounter = (TextView) findViewById(R.id.tvCounter);
tvFilename = (TextView) findViewById(R.id.tvFilename);
tvFilesize = (TextView) findViewById(R.id.tvFilesize);
tvDate = (TextView) findViewById(R.id.tvDate);
createContextMenu();
initDropbox();
} catch (Exception e) {
Log.e("GalleryPagerActivity", e.getLocalizedMessage());
}
}
/**
* Initialise the pager
*/
private void initialisePager() {
mPager = (ViewPager) super.findViewById(R.id.viewpager);
mPager.setAdapter(this.mPagerAdapter);
mPager.setOnPageChangeListener(new GalleryPageListener(tvCounter, tvFilename, tvFilesize, tvDate, wiList));
mPager.setCurrentItem(selectedPosition, true);
updatePage(selectedPosition);
}
public void updatePage(int position)
{
int focusedPage = position + 1;
Log.i("onPageSelected", "page selected " + position);
WhiteboardMedia wiImage = wiList.get(position);
String imageDate = "N/A";
try {
Date dateTaken= new Date(); //wiImage.getDate();
SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd");
imageDate = sdf.format(dateTaken);
} catch (Exception e) {
}
try {
tvCounter.setText(focusedPage + "/" + wiList.size());
tvFilename.setText(wiImage.getFilename());
tvFilesize.setText(wiImage.getSize() + "a");
tvDate.setText(imageDate);
} catch (Exception e) {
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
}
private WhiteboardMedia getActiveWhiteboardImage() {
return wiList.get(mPager.getCurrentItem());
}
private final int DELETE = 1;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1, DELETE, 2, R.string.delete).setIcon(R.drawable.menu_btn_trash);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE:
deleteMedia();
return true;
}
return super.onContextItemSelected(item);
}
@Override
public void onClick(View v) {
if (v == delete) {
deleteMedia();
}
}
private void deleteMedia() {
//TODO delete the active Fragment and display the next Fragment in the list
}
/******************************************************************************
* Context Menu
*****************************************************************************/
private void createContextMenu() {
//context menu stuff
}
@Override
protected Dialog onCreateDialog(int id) {
//stuff
}
}

FragmentPagerAdapter:

public class GalleryPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public GalleryPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}

Gracias por la ayuda!

OriginalEl autor e-nature | 2012-03-18

5 Comentarios

  1. 14

    Primero, le sugiero que considerar la alteración de su FragmentPagerAdapter, a mirar más como la muestra. Normalmente no tienen una lista de fragmentos, más que un ArrayAdapter normalmente contiene una lista de Views para las filas. Normalmente, se crean los fragmentos de la demanda, y alguien tiene la lista.

    A continuación, para eliminar algo, elimine de su modelo de datos (lo que el FragmentPagerAdapter normalmente envuelve). Asegúrese de que getCount() devolverá el número correcto de elementos. Luego, llame a notifyDataSetChanged() en el FragmentPagerAdapter, que debe dar lugar a un rediseño de la ViewPager.

    OK gracias hasta ahora! Tratando de conseguir mi código como en el ejemplo. En mi código que ir a través de un Objeto de la Lista y llenar el Fragmento de la Lista con la adecuada Fragmentos (Imagen, Audio, Video). for (int i = 0; i < wiList.size(); i++) { WhiteboardMedia tmpWi = wiList.get(i); if (tmpWi.getType() == IMAGE) { fragments.add(IMAGE); } else if () { fragments.add(AUDIO); } else if () { fragments.add(VIDEO); } } mAdapter = new MPagerAdapter(getSupportFragmentManager(), fragments); Donde tengo que colocar este código? En el ejemplo se ve como los Fragmentos son todos del mismo tipo.
    getItem() tendría que tener la inteligencia para devolver el derecho fragmento.
    Ugh, yo he tenido el mismo problema para las edades. Los fragmentos no se recopile y permanecer allí visualmente (en su edad y posición incorrecta) hasta que desplazarse demasiado lejos a la derecha/a la izquierda y el sistema de los sacrificios de ellos y resyncs. Alguna idea de lo que estoy haciendo mal? Mi código es muy parecido al del ejemplo.
    Adición y eliminación de los fragmentos fue suficiente de un dolor que yo, finalmente, escribió ArrayPagerAdapter para tratar de ofrecer una solución mejor: github.com/commonsguy/cwac-pager Es todavía pronto para el componente, pero es una promesa.
    Oh que tiene un aspecto fantástico, gracias! Acabo de recibir la FragmentPagerAdapter de trabajo (se necesita un FragmentStatePager en la final, la vainilla FragmentPagerAdapter no como la eliminación de los fragmentos), pero voy a utilizar el componente próxima vez, ¡gracias!

    OriginalEl autor CommonsWare

  2. 17

    que es la solución que estoy usando:

    mViewPager : es la vista que se utiliza para establecer Fragmento

    mViewPager = (YourViewPager) findViewById(R.id.myPager);

    TABLA : solo es una lista de números Enteros de la posición de todos mis Fragmentos

        public void destroyAllItem() {
    int mPosition = mViewPager.getCurrentItem();
    int mPositionMax = mViewPager.getCurrentItem()+1;
    if (TABLE.size() > 0 && mPosition < TABLE.size()) {
    if (mPosition > 0) {
    mPosition--;
    }
    for (int i = mPosition; i < mPositionMax; i++) {
    try {
    Object objectobject = this.instantiateItem(mViewPager, TABLE.get(i).intValue());
    if (objectobject != null)
    destroyItem(mViewPager, TABLE.get(i).intValue(), objectobject);
    } catch (Exception e) {
    Log.i(TAG, "no more Fragment in FragmentPagerAdapter");
    }
    }
    }
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
    super.destroyItem(container, position, object);
    if (position <= getCount()) {
    FragmentManager manager = ((Fragment) object).getFragmentManager();
    FragmentTransaction trans = manager.beginTransaction();
    trans.remove((Fragment) object);
    trans.commit();
    }
    }
    Esto funciona para mí, gracias!
    Perfecto Douarbou ! Gracias !
    Funciona como un encanto! Guarda Mi tiempo! Gracias 🙂

    OriginalEl autor douarbou

  3. 1

    He encontrado una solución ovverriding el método «onPostResume()» de la actividad y llamar a la notifyDataSetChanged dentro de eso.

    @Override
    protected void onPostResume() {
    super.onPostResume();
    if(this.mCustomPagerAdapter!=null){
    this.mCustomPagerAdapter.notifyDataSetChanged();
    }
    }

    OriginalEl autor Michele Sapignoli

  4. 1

    Si usted está usando FragmentPagerAdapter para la adición y eliminación de fragmentos al azar de posición(no siempre al final) en forma dinámica, no es un método que necesita para tomar más la atención, que se getItemId. De forma predeterminada, FragmentPagerAdapter utiliza la posición combina viewId como el nombre de la etiqueta para los fragmentos, sin embargo, la situación cambia si se agrega o elimina los fragmentos. Como resultado, usted puede obtener una página vacía porque la posición que usted está agregando está ocupada por un fragmento de. Para resolver este problema, reemplace getItemId.

    @Override
    public long getItemId(int position) {
    long itemId = ...;  //Provide your unique ID here according to you logic
    return itemId;
    }
    Después de conseguir la itemId ¿tengo que quitar manualmente cada Elemento de la FragmentPagerAdapter? ¿Hay alguna otra manera de actualizar automáticamente FragmentPagerAdapter basado en el Modelo de datos?
    Lo que usted necesita hacer es llamar a la notifyDatasetChanged en el adaptador después de la adición o eliminación de fragmentos. No estoy seguro que esto responda a su «automáticamente», pregunta.

    OriginalEl autor Jason

  5. 0

    En mi caso, cuando me intente quitar un elemento de la adaptador, voy a hacer como sigue:

    //get the position of item to remove
    int position = getBinding().vp.getCurrentItem();
    //remove the item from adapter
    adapter.removeItem(position);
    adapter.notifyDataSetChanged();
    //minus one from the count
    totalInvoice--;
    updateTitle(getBinding().vp.getCurrentItem());
    if (totalInvoice == 0) {
    finish();
    }
    //set the adapter to view pager again            
    getBinding().vp.setAdapter(adapter);
    //smooth scroll to given position
    getBinding().vp.setCurrentItem(position);

    La razón por la que hice anteriormente es que me parece que a pesar de que se elimina de la lista de datos, pero el punto de vista de un fragmento todavía existen. Así que usted tiene que dejar a la vista localizador instanciar el punto de vista de la posición dada. La respuesta por encima de la cual tratando de eliminar todos los fragmentos no funciona para mí. Así, me encuentro la manera pobre de configuración de adaptador para ver localizador de nuevo.

    OriginalEl autor Shouheng Wang

Dejar respuesta

Please enter your comment!
Please enter your name here