ListView horizontal en Android?


215

¿Es posible hacer el ListViewhorizontal? He hecho esto usando una vista de galería, pero el elemento seleccionado llega al centro de la pantalla automáticamente. No quiero el elemento seleccionado en el mismo lugar en el que hice clic. ¿Cómo puedo rectificar este problema? Mi idea era establecer el ListViewcon un desplazamiento horizontal. Comparte tu idea?


1
use este enlace de mi publicación para crear una vista de lista horizontal. Espero que lo ayude.
FAIZ ANWAR

2
@Indra que el blog que mencionaste ha sido eliminado
Animesh Mangla

Puede consultar este ejemplo thedeveloperworldisyours.com/android/…
Cabezas

Respuestas:


123

Según la documentación de Android, RecyclerViewes la nueva forma de organizar los elementos en la vista de lista y mostrarlos horizontalmente

Ventajas:

  1. Dado que mediante el uso del adaptador Recyclerview, el patrón ViewHolder se implementa automáticamente
  2. La animación es fácil de realizar.
  3. Muchas más funciones

Más información sobre RecyclerView:

  1. grokkingandroid.com
  2. antonioleiva.com

Muestra:

survivingwithandroid.com

Simplemente agregue el siguiente bloque para hacer ListViewque sea horizontal desde vertical

Fragmento de código

LinearLayoutManager layoutManager= new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);

1
Esta será la mejor solución si Google soluciona los problemas con LayoutManager. code.google.com/p/android/issues/detail?id=74772
Ponsuyambu Velladurai

para crear una vista de reciclador simple, use este ejemplo: android-examples.com/…
Matcoil

1
Ok, ¿de qué manera para los widgets?
Vladislav

A diferencia de otras vistas respaldadas por adaptadores, como ListView o GridView, RecyclerView permite que el código del cliente proporcione disposiciones de diseño personalizadas para las vistas secundarias. Estos arreglos están controlados por RecyclerView.LayoutManager. Se debe proporcionar un LayoutManager para que RecyclerView funcione.
Yohanes AI

RecyclerView aún no puede manejar los clics en los elementos (no mencione RecyclerView.Selection class) tan buenos y fáciles como ListView: esa es una de las pocas razones por las que creo que RecyclerView no es la mejor respuesta para esta pregunta.
Edward Quijote el

60

Paul no se molesta en corregir los errores de su biblioteca ni acepta las correcciones de los usuarios. Es por eso que sugiero otra biblioteca que tenga una funcionalidad similar:

https://github.com/sephiroth74/HorizontalVariableListView

Actualización : el 24 de julio de 2013, el autor (sephiroth74) lanzó una versión completamente reescrita basada en el código de Android 4.2.2 ListView. ¡Debo decir que no tiene todos los errores que tenía la versión anterior y funciona muy bien!


2
Esta debería ser una respuesta aceptada, porque esta HorizontalVariableListView es mucho más avanzada que la de Paul. Por ejemplo, tiene un método apropiado para seleccionar la posición en una lista, el de Paul tiene "TODO: implementar algún día" en su lugar.
Yan.Yurkin

55
Tenga en cuenta esta solución requiere Android 2.3 o superior
user1032613

1
HorizontalVariableListView de sephiroth74 es exactamente lo que espera que sea: una copia de ListView del código fuente de Android con todos los métodos actualizados para moverse horizontalmente en lugar de verticalmente. Todavía no me he encontrado con ningún problema. ¡Muchas gracias por dirigirme allí, Malachiasz!
SilithCrowe

well wrap_content to listview todavía no es compatible con esta lib
Kalpesh Lakhani

1
Ahora está despreciado
Animesh Mangla

28

La respuesta de @Paul vincula a una gran solución, pero el código no permite usar onClickListeners en elementos secundarios (nunca se llama a las funciones de devolución de llamada). He estado luchando durante un tiempo para encontrar una solución y he decidido publicar aquí lo que necesita modificar en ese código (en caso de que alguien lo necesite).

En lugar de anular la dispatchTouchEventanulación onTouchEvent. Use el mismo código dispatchTouchEventy elimine el método (puede leer la diferencia entre los dos aquí http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers )

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean handled = mGesture.onTouchEvent(event);
    return handled;
}

Luego, agregue el siguiente código que decidirá robar el evento de los elementos secundarios y dárselo a nuestro onTouchEvent, o dejar que sea manejado por ellos.

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch( ev.getActionMasked() ){
        case MotionEvent.ACTION_DOWN:
             mInitialX = ev.getX();
             mInitialY = ev.getY();             
             return false;
        case MotionEvent.ACTION_MOVE:
             float deltaX = Math.abs(ev.getX() - mInitialX);
             float deltaY = Math.abs(ev.getY() - mInitialY);
             return ( deltaX > 5 || deltaY > 5 );
        default:
             return super.onInterceptTouchEvent(ev);
    }
}

Finalmente, no olvides declarar las variables en tu clase:

private float mInitialX;
private float mInitialY;

13
¿Por qué no envía esto como una solicitud de extracción a Paul?
Cristian

ev.getActionMasked () no está disponible en la plataforma Android 2.1. ¿Sabes cómo superar esto?
Eugene Popovich

parece que puedo usar int maskedAction = ev.getAction () & MotionEvent.ACTION_MASK que debería ser igual a ev.getMaskedAction ()
Eugene Popovich

¡Realmente útil! pero al cambiar el código a onTouchEvent obtuve un extraño desplazamiento. Lo guardé en dispatchTouchEvent y funciona perfectamente. Gracias
jbc25

jbc25 puedo confirmar que ocurren saltos extraños si utilizo esta solución
Eugene Popovich

23

Desde que Google introdujo la Biblioteca de soporte de Android v7 21.0.0, puede usar RecyclerView para desplazar elementos horizontalmente. El widget RecyclerView es una versión más avanzada y flexible de ListView.

Para usar RecyclerView, simplemente agregue dependencia:

com.android.support:recyclerview-v7:23.0.1

Aquí hay una muestra:

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);

        MyAdapter adapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(adapter);
    }
}

Más información sobre RecyclerView:


21

Esto es un poco (muy) tarde, pero estoy publicando esto en caso de que alguien venga más tarde.

La biblioteca de soporte a partir de la vista previa de Android L tiene una función RecyclerViewque hace exactamente lo que desea.

En este momento, sólo se puede conseguir a través del SDK L de vista previa y que necesita para establecer su minSdka L. Pero puede copiar todos los archivos necesarios en su proyecto y usarlos de esa manera hasta que L salga oficialmente.

Puede descargar los documentos de vista previa aquí .

Advertencia: La API para Recycler View puede cambiar y puede tener errores.

Actualizado

El código fuente para la vista de lista horizontal es:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

Hola funciona porque lo intento y no puedo hacer un RecyclerView horizontal. ¿Puedes poner algo de código? gracias
Cocorico

Simplemente configure el LinearLayoutManager- vea aquí: stackoverflow.com/questions/28460300/…
Stéphane

19

Descargue el archivo jar desde aquí

ahora colóquelo en su carpeta libs, haga clic derecho y seleccione 'Agregar como biblioteca'

ahora en main.xml pon este código

 <com.devsmart.android.ui.HorizontalListView
    android:id="@+id/hlistview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

ahora en la clase de actividad si desea la vista de lista horizontal con imágenes, luego coloque este código

  HorizontalListView hListView = (HorizontalListView) findViewById(R.id.hlistview);
    hListView.setAdapter(new HAdapter(this));


 private class HAdapter extends BaseAdapter {

    LayoutInflater inflater;

    public HAdapter(Context context) {
        inflater = LayoutInflater.from(context);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return Const.template.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.listinflate, null);
            holder = new HViewHolder();
            convertView.setTag(holder);

        } else {
            holder = (HViewHolder) convertView.getTag();
        }
        holder.img = (ImageView) convertView.findViewById(R.id.image);
        holder.img.setImageResource(Const.template[position]);
        return convertView;
    }

}

class HViewHolder {
    ImageView img;
}

¿No es compatible con ningún selector o con ningún selector personalizado? ¿alguna idea?
Nitin Misra

¿Puedo agregar una matriz de números en lugar de imágenes?
souravlahoti

@BeingSrv sí puedes
Siddhpura Amit

Después de ponerlo en la carpeta libs, haga clic derecho y presione 'Agregar como biblioteca'
M. Usman Khan

cómo a la lista de desarrolladores de horizontallistview como en pulse, bbcnews por favor ayúdame
Harsha

13

En realidad es muy simple : simplemente gire la vista de lista para colocarla de lado

mlistView.setRotation(-90);

Luego, al inflar los elementos secundarios, eso debería estar dentro del método getView. giras a los niños para pararse derechos:

 mylistViewchild.setRotation(90);

Editar: si su ListView no se ajusta correctamente después de la rotación, coloque el ListView dentro de este RotateLayout de esta manera:

 <com.github.rongi.rotate_layout.layout.RotateLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:angle="90"> <!-- Specify rotate angle here -->

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent">
    </ListView>
</com.github.rongi.rotate_layout.layout.RotateLayout>

1
Lo he intentado, no es tan simple. No logré ajustar la vista girada al ancho y alto de la pantalla. Y esta API solo está disponible en dispositivos nuevos.
Malachiasz

Antes de rotar, establezca el ancho de listViews en la altura de la pantalla y establezca la altura de las visualizaciones de lista en el ancho de las pantallas ... .
kc ochibili

1
¿Has estado intentando lo que dices? Tengo y nada de eso funciona.
Malachiasz

¿Intentaste cambiar los valores después de rotar? No veo por qué no debería funcionar. (si se pregunta cómo conocería los valores anteriores de altura y anchura después de rotar, puede guardarlos en una variable antes de rotar y luego aplicarlos después de rotar.
kc ochibili

La nueva versión de esta biblioteca ( stackoverflow.com/a/16589629/2075875 ) hace el trabajo como debería y funciona desde Android 2.3 mientras setRotation () está disponible desde 3.0, así que no quiero volver a jugar con rotate, pero animo intente usted mismo y presente el código de trabajo.
Malachiasz

9

Mi solución es simplemente usar el ViewPagerwidget. No está bloqueado en el centro como Galleryy tiene características incorporadas para reciclar vistas (como ListView). Es posible que vea un enfoque similar en la aplicación Google Play, siempre que trate con listas desplazables horizontalmente.

Solo necesita extender PagerAdaptery realizar un par de ajustes allí:

public class MyPagerAdapter extends PagerAdapter {

    private Context mContext;

    public MyPagerAdapter(Context context) {
        this.mContext = context;
    }

    // As per docs, you may use views as key objects directly 
    // if they aren't too complex
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.item, null);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    // Important: page takes all available width by default,
    // so let's override this method to fit 5 pages within single screen
    @Override
    public float getPageWidth(int position) {
        return 0.2f;
    }
}

Como resultado, tendrá un widget desplazable horizontalmente con adaptador, como este: ingrese la descripción de la imagen aquí


3
es desplazable como ListView, pero en dirección horizontal. La única diferencia que veo: los elementos se desplazan uno por uno, por lo que no es posible desplazarse a la mitad del siguiente elemento. Pero así es como funciona ViewPager.
fraggjkee

8

Nota: Android ahora admite vistas de lista horizontal utilizando RecyclerView, por lo que ahora esta respuesta está en desuso, para obtener información sobre RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView

He desarrollado una lógica para hacerlo sin usar ninguna biblioteca de vista de desplazamiento horizontal externa, aquí está la vista horizontal que logré y publiqué mi respuesta aquí: https://stackoverflow.com/a/33301582/5479863

Mi respuesta json es esta:

{"searchInfo":{"status":"1","message":"Success","clist":[{"id":"1de57434-795e-49ac-0ca3-5614dacecbd4","name":"Theater","image_url":"http://52.25.198.71/miisecretory/category_images/movie.png"},{"id":"62fe1c92-2192-2ebb-7e92-5614dacad69b","name":"CNG","image_url":"http://52.25.198.71/miisecretory/category_images/cng.png"},{"id":"8060094c-df4f-5290-7983-5614dad31677","name":"Wine-shop","image_url":"http://52.25.198.71/miisecretory/category_images/beer.png"},{"id":"888a90c4-a6b0-c2e2-6b3c-561788e973f6","name":"Chemist","image_url":"http://52.25.198.71/miisecretory/category_images/chemist.png"},{"id":"a39b4ec1-943f-b800-a671-561789a57871","name":"Food","image_url":"http://52.25.198.71/miisecretory/category_images/food.png"},{"id":"c644cc53-2fce-8cbe-0715-5614da9c765f","name":"College","image_url":"http://52.25.198.71/miisecretory/category_images/college.png"},{"id":"c71e8757-072b-1bf4-5b25-5614d980ef15","name":"Hospital","image_url":"http://52.25.198.71/miisecretory/category_images/hospital.png"},{"id":"db835491-d1d2-5467-a1a1-5614d9963c94","name":"Petrol-Pumps","image_url":"http://52.25.198.71/miisecretory/category_images/petrol.png"},{"id":"f13100ca-4052-c0f4-863a-5614d9631afb","name":"ATM","image_url":"http://52.25.198.71/miisecretory/category_images/atm.png"}]}}

Archivo de diseño:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5">    
    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" />
    <HorizontalScrollView
        android:id="@+id/horizontalScroll"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:id="@+id/ll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">    
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

archivo de clase:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.ll);
        for (int v = 0; v < collectionInfo.size(); v++) {
            /*---------------Creating frame layout----------------------*/

            FrameLayout frameLayout = new FrameLayout(ActivityMap.this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, getPixelsToDP(90));
            layoutParams.rightMargin = getPixelsToDP(10);
            frameLayout.setLayoutParams(layoutParams);

            /*--------------end of frame layout----------------------------*/

            /*---------------Creating image view----------------------*/
            final ImageView imgView = new ImageView(ActivityMap.this); //create imageview dynamically
            LinearLayout.LayoutParams lpImage = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            imgView.setImageBitmap(collectionInfo.get(v).getCatImage());
            imgView.setLayoutParams(lpImage);
            // setting ID to retrieve at later time (same as its position)
            imgView.setId(v);
            imgView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    // getting id which is same as its position
                    Log.i(TAG, "Clicked on " + collectionInfo.get(v.getId()).getCatName());
                    // getting selected category's data list
                    new GetSelectedCategoryData().execute(collectionInfo.get(v.getId()).getCatID());
                }
            });
            /*--------------end of image view----------------------------*/

            /*---------------Creating Text view----------------------*/
            TextView textView = new TextView(ActivityMap.this);//create textview dynamically
            textView.setText(collectionInfo.get(v).getCatName());
            FrameLayout.LayoutParams lpText = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER);
            // Note: LinearLayout.LayoutParams 's gravity was not working so I putted Framelayout as 3 paramater is gravity itself
            textView.setTextColor(Color.parseColor("#43A047"));
            textView.setLayoutParams(lpText);
            /*--------------end of Text view----------------------------*/

            //Adding views at appropriate places
            frameLayout.addView(imgView);
            frameLayout.addView(textView);
            linearLayout.addView(frameLayout);

        }

 private int getPixelsToDP(int dp) {
        float scale = getResources().getDisplayMetrics().density;
        int pixels = (int) (dp * scale + 0.5f);
        return pixels;
    }

El truco que está funcionando aquí es la identificación que he asignado a ImageView "imgView.setId (v)" y luego de aplicar onClickListener a eso, nuevamente estoy recuperando la identificación de la vista ... También he comentado dentro del código, así que que es fácil de entender, espero que esto sea muy útil ... Happy Coding ... :)

http://i.stack.imgur.com/lXrpG.png


1
He editado y publicado la explicación completa aquí, gracias por su sugerencia :)
Abdul Aziz

Hola, gracias por tu código, ¿puedes publicar el método getPixelsToDP()?
Skizo-ozᴉʞS

@Skizo He agregado ese método al final del código de Java, eche un vistazo
Abdul Aziz


5

Puede usar RecyclerView en la biblioteca de soporte. RecyclerView es una versión generalizada de ListView que admite:

  • Un administrador de diseño para posicionar artículos
  • Animaciones predeterminadas para operaciones de elementos comunes.

Android Recycler Ver documentos


Esta es la verdadera respuesta a partir de esta fecha tardía. Pero incluso esto aún no está listo y todavía está en 'vista previa'
Martin

3

He buscado mucho para encontrar una solución a este problema. La respuesta corta es que no hay una buena solución, sin anular los métodos privados y ese tipo de cosas. Lo mejor que encontré fue implementarlo yo mismo desde cero extendiéndolo AdapterView. Es bastante miserable. Vea mi pregunta SO sobre ListViews horizontales .


Lamentablemente, su respuesta es la correcta. Incluso Google confirma que la única forma de vista de lista horizontal es Galería. Pero Galería no es lo mismo que una vista de lista horizontal. ¿Estaría dispuesto a compartir su código? ¿Reciclas vistas?
Patrick Boos

1
Lamentablemente, el código fue escrito para mi empresa, por lo que es propietario. Sin embargo, espero encontrar algo de tiempo libre en los próximos meses para reescribirlo (la implementación original es bastante inestable) y liberarlo al dominio público. También puedo decirte que comencé tomando esta demo de Sony Ericsson, cambiando todas las 'x' a 'y' y todas las 'anchuras' a 'alturas'. Luego eliminé las transformaciones 3D y agregué un comportamiento de detención al final.
Neil Traft

@Neil Traft, ¿cómo arreglaste la posición de los artículos? ¿Y qué hay de detenerse al final?
Adrian Magdas

Honestamente, realmente fue solo un montón de conjeturas. Tomó mucho tiempo hacerlo bien, y estoy convencido de que hay una mejor manera. Pero la premisa básica es que, en el fillListDown()método, debe realizar un seguimiento del borde inferior del último elemento de la lista. Pero no sabe dónde está esa ventaja hasta que realmente crea el último elemento (adapter.getCount () - 1). Entonces espera hasta que se cree ese elemento y luego puede almacenar la ubicación del borde. Una vez que sepa eso, puede asegurarse de que mListTop nunca sea menor que 0 y nunca más que el alto de la lista.
Neil Traft

1
Si realmente, realmente, ABSOLUTAMENTE necesitas una lista horizontal, te ANOTARÍA ENCARECIDAMENTE que te rindas o uses la Galería.
Neil Traft

3

Tuve que hacer lo mismo para uno de mis proyectos y terminé escribiendo el mío también. Lo llamé HorzListView ahora es parte de mi biblioteca Aniqroid de código abierto .

http://aniqroid.sileria.com/doc/api/ (Busque descargas en la parte inferior o use el proyecto de código de Google para ver más opciones de descarga: http://code.google.com/p/aniqroid/downloads/list )

La documentación de la clase está aquí: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/HorzListView.html


¿Cómo puedo configurar la posición de desplazamiento mediante programación?
Dima Portenko

El método setSelection () está ahí, pero puede no estar implementado al 100%. Intentalo.
Sileria

1

Para mi aplicación, uso un HorizontalScrollView que contiene LinearLayout dentro, que tiene la orientación establecida en horizontal. Para agregar imágenes dentro, creo ImageViews dentro de la actividad y los agrego a mi LinearLayout. Por ejemplo:

<HorizontalScrollView 
        android:id="@+id/photo_scroll"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scrollbars="horizontal"
        android:visibility="gone">

        <LinearLayout 
            android:id="@+id/imageview_holder"
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:layout_height="match_parent">

        </LinearLayout>
    </HorizontalScrollView>

Y esto funciona perfectamente bien para mí. En la actividad, todo lo que tengo que hacer es algo como el siguiente código:

LinearLayout imgViewHolder = findViewById(R.id.imageview_holder);
ImageView img1 = new ImageView(getApplicationContext());
//set bitmap
//set img1 layout params
imgViewHolder.add(img1);
ImageView img2 = new ImageView(getApplicationContext());
//set bitmap
//set img2 layout params
imgViewHolder.add(img2); 

Como dije, eso funciona para mí, y espero que ayude a alguien que busque lograr esto también.


0

bueno, siempre puedes crear tus vistas de texto, etc. dinámicamente y configurar tus onclicklisteners como lo harías con un adaptador


¿Qué quieres decir? no te entiendo por favor, publique un fragmento de código sobre su idea?
Praveen

dígame el propósito de la "vista de lista horizontal" ¿tendrá vistas complejas / múltiples? por ejemplo, 2 cuadros de texto 1 barra de progreso? o simplemente digamos texto sin formato ¿También tiene un número fijo de elementos dentro de esa vista o desea cambiarlo dinámicamente? Respóndeme a esto y podré ayudarte con el código
2010

Quiero hacer la galería de texto horizontal. pero el elemento seleccionado viene al centro por defecto. Quiero ser el elemento seleccionado debe estar donde hice clic en eso. por favor revise también mis publicaciones: stackoverflow.com/questions/3237566/text-gallery-on-android y stackoverflow.com/questions/3318617/…
Praveen

0

HorizontialListView no puede funcionar cuando los datos en el adaptador están involucrados en otro hilo. Todo funciona al 100% en el subproceso de la interfaz de usuario. Este es un gran problema en multithread. Creo que usar HorizontialListView no es la mejor solución para su problema. HorzListView es una mejor manera. Simplemente reemplace su Galería anterior con HorzListView. No necesita modificar el código del adaptador. Entonces todo va de la manera que espera. Vea https: // stackoverflow.com/a/12339708/1525777 sobre HorzListView.


0

Había usado un enlace de vista de lista horizontal en mi proyecto y obtuve buenos resultados. Inicialmente había usado la biblioteca devsmart , pero me dio algunos problemas. Entonces, la mejor manera de usar el enlace de vista de lista horizontal, ya que recuperó mis problemas y también recientemente lancé mi aplicación en Google PlayStore usando esta biblioteca y obtuve una buena respuesta de los usuarios. Por lo tanto, le recomiendo que use la misma biblioteca que mencioné anteriormente para mostrar la vista de lista horizontalmente. Disfruta :)


0

Hay una gran biblioteca para eso, llamada TwoWayView , es muy fácil de implementar, solo incluya la biblioteca del proyecto en su espacio de trabajo y agréguela como un proyecto de biblioteca a su proyecto original, y luego siga los siguientes pasos que se mencionan originalmente aquí :

Primero, agreguemos un estilo que indique la orientación de ListView (horizontal o vertical) en (res / values ​​/ styles.xml):

<style name="TwoWayView">
    <item name="android:orientation">horizontal</item>
</style>

Luego,

En su XML de diseño, use el siguiente código para agregar TwoWayView:

<org.lucasr.twowayview.TwoWayView 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/lvItems"
     style="@style/TwoWayView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:drawSelectorOnTop="false"
     tools:context=".MainActivity" />

y, por último, simplemente declararlo y tratarlo como cualquier otro regular ListView:

TwoWayView lvTest = (TwoWayView) findViewById(R.id.lvItems);

Todos los métodos de ListViewfuncionarán aquí como de costumbre, pero solo noté una diferencia, que es cuando configuro el modo de elección, el método setChoiceModeno toma un intvalor sino un valor de enumllamado ChoiceMode, así list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);será lvTest.setChoiceMode(ChoiceMode.SINGLE); // or MULTIPLE or NONE.


1
Intenté esto, pero no me permitirá usar mi propio ArrayAdapter <PreviewImage>
DeNitE Appz

-1

Puede usar ViewFlipper para incluir el diseño XML y agregar imágenes, vista de lista para cada diseño XML

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.