¿Cómo implementar una galería sin fin en Android?
Estoy usando un diseño de galería en mi aplicación. Funciona cuando el usuario mueve las imágenes en la galería de izquierda a derecha (es infinito que significa que los elementos se repiten de nuevo). Pero cuando el usuario se mueve de derecha a izquierda y llega al primer elemento, no lo hace. Después de eso no aparecen elementos. Pero quiero repetir elementos de este lado también. ¿Me puede dar algunas sugerencias?
Gallery g = (Gallery) findViewById(R.id.gallery); g.setAdapter(new ImageAdapter(this)); g.setFocusable(true); g.setSelection((int)(Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2)% mImageIds.length); g.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { try { imageid=position; ((ImageView)findViewById(R.id.ImageViewlarge)).setImageResource(mImageIds[position]); ((TextView)findViewById(R.id.TextViewImageName)).setText(imgNames[position]); mp = MediaPlayer.create(SeaSpell.this,audioTrack[position]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); }
- ¿Cómo actualizar listview cuando vuelve a presionar desde otra actividad Android?
- El mejor lugar para añadirHeaderView en ListFragment
- Cómo obtener los elementos de la lista seleccionada de un Listview con checkBox y Adaptador personalizado?
- Animar elementos recién agregados en ListView
- Imageloader sólo carga imágenes en la lista después de listitem ha salido de la pantalla
¿Cómo puedo hacer que mi vista de galería sea circular? Soy capaz de hacerlo de izquierda a derecha infinitamente, pero cuando arrastrar de derecha a izquierda está mostrando el punto final.
- Configurar la fuente personalizada dentro de `ImageAdapter extends BaseAdapter`
- RecyclerView no se actualiza después de NotifyDataSetChanged (), el contenido aparece después de encender y apagar la pantalla
- Utilizar Cursor con el adaptador ListView para una gran cantidad de datos
- Cuando se desplaza un listview con un adaptador personalizado demasiado rápido arriba y abajo, getView () comienza a comportarse de manera extraña. ¿Por qué?
- GetLayoutInflater dentro de la costumbre simpleCursorAdapter
- Cuando getView () en ArrayAdapter se llama
- Estado de comprobación de ListView Viewholder
- El contenido del adaptador ha cambiado pero ListView no recibió una notificación - Con AsyncTask
En getView:
if(position>21){ position=0; }
Esto debe ser eliminado ya que debe ser manejado por la función checkPosition.
En el checkPosition:
Para el operador del módulo ( %
), dado a % b
si 0 <= a < b
entonces el resultado será a
. Para b <= a < 2*b
entonces el resultado será ab
, así que si b == a
, entonces el resultado es 0
. Esto continúa para cualquier entero positivo, por lo que el cheque debe ser:
if (position > 0) position = position % mImageIds.length;
Ahora, lo que le falta de esto es manejar el caso donde la position < 0
.
aa%3 aa%3 f(a) 0 0 0 0 0 1 1 -1 -1 2 2 2 -2 -2 1 3 0 -3 0 0 4 1 -4 -1 2 5 2 -5 -2 1 6 0 -6 0 0
Lo que queremos en este caso es que se remonte al final de la lista – el f(a)
en la tabla anterior.
Como puede verse en la tabla anterior, si a
es negativo entonces -b < a <= 0
. Además, si hacemos f(a) = (a % b) + b
obtenemos el resultado deseado.
Esto significa que la lógica en checkPosition se convierte en:
position = position % mImageIds.length; if (position < 0) position = position + mImageIds.length;
Que debería funcionar para todos los valores de position
independientemente del valor de mImageIds.length
.
Si alguien quería hacerlo también ir hacia atrás, puede implementar esto. Todo lo que realmente hace es comenzar la galería en el medio.
GalleryName.setSelection((int)( Integer.MAX_VALUE / 2 ) - ( Integer.MAX_VALUE / 2 ) % mImageIds.length);
El código del adaptador para la explicación de reece se puede encontrar aquí: ¿galería circular del androide?
Sólo asegúrese de usar la sugerencia de gogothee para mover la selección inicial a la mitad del rango. (Para que pueda desplazarse hacia la izquierda y la derecha casi siempre). Por ejemplo, lo hice así:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylayout); //get references to UI components mGallery = (Gallery) findViewById(R.id.filter_gallery); //connect Galleries with adapters mGallery.setAdapter(new GalleryAdapter(this)); //auto-select first image (position 1073741820) mGallery.setSelection((int)(Integer.MAX_VALUE/2) - ( (Integer.MAX_VALUE/2) % mImageBuffer.getCount() ) ); }
Un enchufe auto sin vergüenza, acaba de escribir una galería de desplazamiento infinito Tutorial:
http://blog.blundell-apps.com/infinite-scrolling-gallery/
Yo uso las mismas matemáticas modulas como @reece, código fuente también se puede descargar.
Puede utilizar imágenes en su tarjeta SD o imágenes en su directorio / resources / drawable
Para hacer el primer elemento como centro de matriz disponible:
Your_gallery_obj.setSelection ((int) (Integer.MAX_VALUE / 2) – (Integer.MAX_VALUE / 2)% your_array_size);
Para hacer que el elemento central sea el centro de matriz disponible:
Your_gallery_obj.setSelection ((int) (Integer.MAX_VALUE / 2) + (Integer.MAX_VALUE / 2)% your_array_size);
- Iniciar Actividad desde la pantalla de preferencias (intención definida en el archivo xml)
- NullPointerException al usar LocalBroadcastManager