studio programacion para móviles español edición desarrollo desarrollar curso aprende aplicaciones android listview choice

para - manual programacion android español pdf



Opción única personalizada ListView (4)

**

<TextView android:id="@+id/tv_size" android:layout_width="200dp" android:layout_height="wrap_content" android:text="TextView" android:textSize="15sp" android:width="200dp" /> <TextView android:id="@+id/tv_price" android:layout_width="70dp" android:layout_height="wrap_content" android:text="TextView" android:textSize="15sp" android:width="70dp" /> <RadioButton android:id="@+id/radioButton" android:layout_width="wrap_content" android:layout_height="wrap_content" />

**

Quiero hacer una vista de lista personalizada con dos vistas de texto y un botón de opción en una sola fila. Y en la lista, haga clic en el botón de radio, el estado debe estar activado. No puedo usar el adaptador simple aquí.

Ya he formulado esa pregunta . Elección de diseño de fila personalizada de Vista única, pero no encuentro ninguna solución satisfactoria.

Lo que estoy haciendo actualmente es usar simple_list_item_single_choice y colocar los datos de ambos TextViews en uno solo separados por algunos espacios en blanco. Pero aquí está empeorando (se muestra en la imagen de abajo).

Lo que quiero es arreglar la ubicación del tamaño y el precio y hacer que la vista de lista sea una opción única.

El diseño de XML para la lista puede ser algo como:

**<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="horizontal" > <TextView android:id="@+id/tv_size" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:textSize="15sp" android:width="200dp" /> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:textSize="15sp" android:width="70dp" /> <RadioButton android:id="@+id/radioButton" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>**

¿Cómo hacer adaptador personalizado para eso?


He estado buscando una respuesta a este problema toda la mañana, y lo más útil que he encontrado hasta ahora es este artículo .

Si bien aún no he implementado la solución que sugiere, parece que va por el camino correcto.

Básicamente, el ListView opción única espera que los widgets que le proporcione implementen la interfaz de Checkable . LinearLayout y otros no. Por lo tanto, debe crear un diseño personalizado que herede LinearLayout (o cualquier diseño que desee utilizar para sus artículos) e implemente la interfaz necesaria.


Manejó un problema similar con un Hack (no es una solución perfecta ... pero aún funciona ...)

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { for (int i = 0; i < parent.getCount() ; i ++) { View v = parent.getChildAt(i); RadioButton radio = (RadioButton) v.findViewById(R.id.radio); radio.setChecked(false); } RadioButton radio = (RadioButton) view.findViewById(R.id.radio); radio.setChecked(true); } });


Tuve una situación similar pero la arreglé fácilmente. Prueba esto:

  1. Extienda ListActivity y configure su adaptador de lista personalizado

    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //if you need title to be hidden setContentView(R.layout.activity_add_to_cart_select_service_plan); setListAdapter(adapter); }

  2. Crear un campo para almacenar la posición del índice seleccionado en el adaptador

    int selectedIndex = -1;

  3. Proporcionar una interfaz para ello

    public void setSelectedIndex(int index){ selectedIndex = index; }

  4. Establezca el estado marcado en verdadero o falso según el índice seleccionado dentro de getView ()

    @Override public View getView(int position, View convertView, ViewGroup parent) { RadioButton rbSelect = (RadioButton) convertView .findViewById(R.id.radio1); if(selectedIndex == position){ rbSelect.setChecked(true); } else{ rbSelect.setChecked(false); } }

  5. Establezca el botón de radio de los atributos que se pueden enfocar y hacer clic en ''falso''

    <RadioButton android:id="@+id/radio1" android:checked="false" android:focusable="false" android:clickable="false" />

  6. Establezca listview descendantFocusability attrib to ''beforeDescendants''

    <ListView android:id="@android:id/list" android:choiceMode="singleChoice" android:descendantFocusability="beforeDescendants" />

  7. Anular onListItemClick

    @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); adapter.setSelectedIndex(position); adapter.notifyDataSetChanged(); }

Eso es todo ... corre y comprueba