Custom Single choice ListView

Quiero hacer una vista de lista personalizada que tenga dos vistas de texto y un botón de opción en una sola fila. Y en listitem, haga clic en el botón de estado debe alternar. No puedo usar el Adaptador simple aquí.

Ya le he hecho esa pregunta a una opción, ListView Custom Row Layout, pero no encuentro ninguna solución satisfactoria.

Lo que estoy haciendo actualmente es que estoy usando simple_list_item_single_choice y poniendo los datos de ambos TextViews en uno solo separado por algunos espacios en blanco. Pero aquí está empeorando (se muestra en la imagen a continuación).

http://db.tt/ulP6pn7V

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

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

**     ** 

¿Cómo hacer un 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 no implementé la solución que aún sugiere, parece que está en el camino correcto.

Básicamente, el ListView opción espera que los widgets que le proporcione implementen la interfaz de Checkable . LinearLayout et al no. Por lo tanto, debe crear un diseño personalizado que herede LinearLayout (o el diseño que desee utilizar para sus elementos) e implemente la interfaz necesaria.

Tuve una situación similar, pero solucioné eso 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 de índice seleccionada en el adaptador

     int selectedIndex = -1; 
  3. Proporcionar una interfaz para ello

     public void setSelectedIndex(int index){ selectedIndex = index; } 
  4. Establezca el estado verificado en verdadero o falso en función del í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 enfocable y cliqueable attribs a ‘falso’

       
  6. Establezca listview descenddantFocusability attrib en ‘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 … correr y verificar

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); } }); 

**

    

**