Como hacer ListView horizontales

Ya hemos visto todo lo relacionado sobre los ListView pero que pasa cuando queremos hacer lo mismo en horizontal. Los adapters que hemos visto no sirven por lo tanto hemos de construir uno de la siguiente manera.


Aunque hoy en día un adapter horizontal podría entenderse por un ViewPager, no siempre nos va bien.

Si en lugar de movernos entre paginas nos movemos entre elementos
Si necesitamos ver más de un elemento en la lista.
Poder seleccionar todos los elementos visibles.

Por ejemplo el adapter horizontal lo he usado como modo de selector entre niveles, parecido a como se ven los capítulos del famoso juego AngryBirds. Este tutorial proviene de este proyecto de github: https://github.com/dinocore1/DevsmartLib-Android.git
Es una librería donde tiene un par de ejemplos sobre como ordenar el listview pero en este momento el más interesante es el ListView Horizontal. Solamente ocupa un fichero, por lo que encuentro interesante importarlo directamente que no como una librería externa, al ser tan poco código.

Para empezar con el fichero ya añadido en nuestro proyecto solamente tendremos que crear un xml llamando en este caso a la clase en org.androidconnect.listview.horizontal.adapter.HorizontalListView:



  
  
  

Luego en nuestra activity lo único que necesitaremos será crear una clase extendida de BaseAdapter, donde como vimos en el anterior articulo de los listview nos permitirá inflar las filas a nuestro gusto en este caso siguiendo el viewitem.xml


public class Android_HorizontalListViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.listviewdemo);
		
		HorizontalListView listview = (HorizontalListView) findViewById(R.id.listview);
		listview.setAdapter(new HAdapter());
		
	}
	
	private static String[] dataObjects = new String[]{ "Text #1",
		"Text #2",
		"Text #3",
		"Text android",
		"Text connnect",
		"www.androidconnect.org"}; 
	
	private class  HAdapter extends BaseAdapter {

		public HAdapter(){
			super();
		}
		private OnClickListener mOnButtonClicked = new OnClickListener() {
			
			public void onClick(View v) {
				Button bt = (Button) v;
				
				Toast.makeText(getApplicationContext(), "Hola desde " + bt.getText(), Toast.LENGTH_SHORT).show();			
			}
		};

		
		public int getCount() {
			return dataObjects.length;
		}

		public Object getItem(int position) {
			return null;
		}

		public long getItemId(int position) {
			return 0;
		}

		
		public View getView(int position, View convertView, ViewGroup parent) {
			View retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewitem, null);
			TextView title = (TextView) retval.findViewById(R.id.title);
			Button button = (Button) retval.findViewById(R.id.clickbutton);
			button.setOnClickListener(mOnButtonClicked);
			title.setText(dataObjects[position]);
			
			return retval;
		}
		
	};

}

Obteniendo la siguiente lista:

Para probar todo el código podéis descargarlo desde github: https://github.com/lempere/Android_HorizontalListView/

Enlaces:
https://github.com/dinocore1/DevsmartLib-Android.git

12 comentarios sobre “Como hacer ListView horizontales”

  1. Muchas gracias por este aporte, tengo una pregunta en que parte del codigo obtengo la posición de la imagen al momento de hacer Click?

    Saludos

    1. Necesitas crear un listener para este listview, como cualquier otra lista:

      listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

      @Override
      public void onItemClick(AdapterView< ?> parent, final View view,
      int position, long id) {
      //position -> posición de la fila con imagen que ha hecho click
      }
      });

      Saludos

      1. Gracias por tu respuesta. Pero ha surgido un nuevoinconveniente. Veras, haz de cuenta que elimine el boton y que solo me quede con el ImageView y el TextView. Se que si hago un onClickListener para el TextView el univo Voew que obtendra sera de tipo TextView que sera el que yo le hice Click y podre mostrar en el Toast el contenido que hay dentro del textView. Pero ahora digamos que quiero hacer un onClickListener en el ImageView, a mi me interesa obtener en este caso el valor que hay en el textView pero esta vez haciendole click al imageview, tienes alguna idea? disculpa las molestias de antemano

        Saludos

  2. pregunta ya implemente la lista en mi proyecto pero me surgio un inconveniente, la clase carese de “onscrolllistener” y es algo que necesito, sugerencias???

  3. Una duda, esta librería no me funciona cuando uso fragments, la lista no se ve cuando la uso dentro de un fragment.xml ni dentro de una activity.xml que también incluya fragments, es un error de la librería o estoy haciendo algo mal?

    1. Actualmente la uso dentro de un fragment… necesitaría más detalles para ver, donde esta el error.
      Intenta montar el listview horizontal en una activity simple y ves si falla esto o es al ponerlo en un fragment.

      Saludos

  4. Hola, ya pude agregarla, solo tengo un inconvniente, antes para actualizar la lista utilizaba invalidateViews(), pero aqui no me funciona, alguien me puede ayudar como hago un refresh a la lista para actualizarla?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *