Horizontal ScrollView en el elemento de vista de lista Android

Tengo una vista de lista con 20 filas y deseo fijar un scrollview horizontal para cada artículo de la fila en la visión de la lista, como cada fila contiene más de un artículo.

Aquí está mi código:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <HorizontalScrollView android:id="@+id/hor_scroll" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none" > <LinearLayout android:id="@+id/mainLinear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> </HorizontalScrollView> </RelativeLayout> 

Diseño de fila interior que se va a replicar en una fila cualquier número de veces

 <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="6.0dip" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center_vertical" android:text="Example Value" android:textAppearance="?android:textAppearanceMedium" /> 

BaseAdapter

 public class HorizontalListViewAdapter extends BaseAdapter { private Context context; private ArrayList<ArrayList<DwivediJi>> dataSet; public HorizontalListViewAdapter(Context context) { this.context = context; } @Override public int getCount() { return 20; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); LinearLayout mainLinnerLayout=(LinearLayout)convertView.findViewById(R.id.mainLinear); for (int i = 0; i <5; i++) { View additionView = inflater.inflate(R.layout.inner_layout_file, null,false); LinearLayout innerLinnerLayout=(LinearLayout)additionView.findViewById(R.id.inner_layout); mainLinnerLayout.addView(innerLinnerLayout); } return convertView; } class ViewHolder { TextView tv_titleExample; HorizontalScrollView hzView; LinearLayout linear_layout,main_linear_layout; } } 

Mi problema

Mira la captura de pantalla adjunta. Mi problema es que más de una vista se muestra en un momento en cada fila.

Quiero que sólo una vista debe mostrar al usuario en un momento y por el resto todo lo que el usuario tiene que hacer es deslizar izquierda a derecha o derecha a izquierda.

Introduzca aquí la descripción de la imagen

Nota: No es una solución ideal, pero debe proporcionar lo que desea. Otra Nota: Esto puede hacer que su listview ligeramente janky, dependiendo de la complejidad de diseño

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.horizontal_list_item, null,false); LinearLayout mainLinnerLayout=(LinearLayout)convertView.findViewById(R.id.mainLinear); for (int i = 0; i <5; i++) { View additionView = inflater.inflate(R.layout.inner_layout_file, null,false); LinearLayout innerLinnerLayout=(LinearLayout)additionView.findViewById(R.id.inner_layout); // If the width varies for each innerLinnerLayout, then remove the if block & always calculate padding value // padding is an integer initialized to -1 in the constructor if (padding == -1) { int width = context.getResources().getDisplayMetrics().widthPixels; innerLinnerLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); padding = width - additionView.getMeasuredWidth(); } // I've set padding to right only, but you could center it by giving left and right padding of value=(padding/2) innerLinnerLayout.setPadding(0, 0, padding, 0); mainLinnerLayout.addView(innerLinnerLayout); } return convertView; } 

El problema es con su adaptador como:

  1. getCount() de su adaptador debe devolver el número total de la lista. Volver 20 no es válido en su contexto – y usted parece tener 20 elementos en su lista. Debe devolver dataSet.size();
  2. getItem() devolverá el elemento de la estructura de datos del modelo, en este caso:

Abajo

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

Además, su método getView debe devolver la vista que muestra los datos del modelo en dado en el parámetro de position . Devolver un ViewGroup con datos ViewGroup no significativos es lo que tiene actualmente. Debe obtener el ArrayList<DwivediJi> desde la posición del parámetro (a través de dataSet.get(position) ) y construir / inflar una vista que muestra correctamente este elemento de estructura de datos.

Cambie el ancho de diseño interno a match_parent. Esto debería ayudarle

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="6.0dip" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center_vertical" android:text="Example Value" android:textAppearance="?android:textAppearanceMedium" /> </LinearLayout> 

Parece que está agregando su diseño interior en este LinearLayout

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

¿Intentaste cambiar su anchura a match_parent también?

Utilice scrollview en el diseño xml y, a continuación, cree dinámicamente HorizontalScrollView dentro de loop:

Ejemplo:

 for(int i.......) //number of HorizontalScrollView needed { HorizontalScrollView mainlinear = new HorizontalScrollView( getApplicationContext()); for(int i.......) //number of items wants to add in HorizontalScrollView { // adding any widgets as per your requirements } mainlinear.addView(Widgetname); scroll.addView(mainlinear); } 
  • Cómo obtener una Java.Lang.NullPointerException en Android Fragment
  • Cómo obtener un problema al comprobar la casilla de verificación generada dinámicamente a través de la vista de lista
  • ¿Cómo implementar un titular de vista?
  • SwipeRefreshLayout interferir con setOnScrollListener
  • ArrayIndexOutOfBoundsException cuando se utiliza ListAdapter
  • Rellene Listview desde el origen de la matriz de cadenas, con un String ArrayAdapter
  • Android - EditTexts dentro de ListView vinculado a Custom ArrayAdapter - manteniendo un registro de los cambios
  • Modificar el elemento seleccionado en Numberpicker Android
  • Cómo deshabilitar o no mostrar ningún encabezado para StickyListHeaders de emilsjolander
  • Inflar diseño en ListItem basado en la variable específica ListItem
  • ListView cargar más en la parte inferior de desplazamiento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.