2011-07-12 13 views
5

He pasado literalmente dos días intentando solucionar este problema. Si alguien pudiera ayudar, estaría masivamente agradecido.Vista de lista personalizada con dos botones en cada fila

lo que estoy tratando de lograr:

Tener un ListView, por lo que el jugador puede añadir nuevas entradas (jugadores), a través de un campo de texto (por el nombre del jugador), y luego un botón de envío. En cada campo de ListView, muestro el nombre del jugador, y luego dos ImageButtons. Uno con un símbolo masculino y otro con un símbolo femenino. El símbolo masculino se activa por defecto, y el usuario puede configurar el reproductor como hombre o mujer al alternar entre el botón masculino o femenino. Finalmente, una vez que el usuario pasa a la siguiente pantalla (una nueva actividad), la aplicación guardará los nombres de los jugadores y el sexo adjunto en alguna forma de almacenamiento y pasará a la siguiente actividad.

lo que he conseguido:

que tienen un simple adaptador de matriz, que en el reproductor de añadir un nuevo nombre de jugador a la lista, corro el notifyDataSetChanged() sobre ella. El adaptador también está configurado para usar un archivo de diseño de fila personalizado. Dentro del archivo de diseño, se ve así:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="wrap_content"> 
    <RelativeLayout android:layout_height="wrap_content" 
     android:layout_width="fill_parent" android:id="@+id/relativeLayout1" android:layout_marginTop="5dp"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:id="@+id/playerName" 
      android:layout_centerVertical="true" android:text="Derp" android:textStyle="bold" android:layout_marginLeft="5dp" android:textSize="22dp" android:textColor="@color/male_blue"></TextView> 
     <ImageButton android:layout_height="60dp" 
      android:layout_width="60dp" android:onClick="maleClickHandler" 
      android:src="@drawable/male_icon_settings" android:id="@+id/buttonA" android:layout_alignParentRight="true" android:layout_marginRight="65dp"></ImageButton> 
     <ImageButton android:onClick="femaleClickHandler" 
      android:layout_height="60dp" android:layout_width="60dp" android:id="@+id/buttonB" 
      android:layout_alignParentRight="true" android:layout_marginRight="5dp" android:src="@drawable/female_icon_settings"></ImageButton> 
    </RelativeLayout> 
</LinearLayout> 

Los dos botones en cada referencia de fila a métodos en el archivo de clase. Aquí está mi código para esto:

public void maleClickHandler(View v) { 

     RelativeLayout vwParentRow = (RelativeLayout) v.getParent(); 
     ImageButton maleButton = (ImageButton) vwParentRow.getChildAt(1); 
     maleButton.setImageDrawable(getResources().getDrawable(
       R.drawable.male_icon_selected)); 
     vwParentRow.refreshDrawableState(); 
    } 

    public void femaleClickHandler(View v) { 

     RelativeLayout vwParentRow = (RelativeLayout) v.getParent(); 
     ImageButton femaleButton = (ImageButton) vwParentRow.getChildAt(2); 
     femaleButton.setImageDrawable(getResources().getDrawable(
       R.drawable.female_icon_selected)); 
     vwParentRow.refreshDrawableState(); 
    } 

todavía no he implementado ningún interconectividad entre estos dos botones, para permitir que sólo uno sea activo a la vez, o uno que incluso untoggle, ya que creo que podría estar tomando el enfoque equivocado por completo.

El problema:

Al añadir nuevas entradas a la lista, DESPUÉS alternar uno y/u otro sexo masculino/botones femeninos, las cosas se ponen realmente con errores, y el icono de hombre/mujer toggled puede mover como debería ser, junto con la secuencia de jugador adjunta, o más probable, aquellos activados permanecerán en esa primera fila (posición de la matriz 0 de la lista), o incluso pasarán a la posición de la segunda lista, Y se copiarán como asignados a la fila encima.

¿Cómo puedes ayudar ...?

He adjuntado una imagen abajo de mi pantalla, desde el emulador, para ayudar a ilustrar mis puntos Screenshot!

Creo que puede ser que tenga que utilizar algún tipo de adaptador personalizado; He leído mucho sobre el tema, pero no puedo encontrar nada relevante para lo que estoy tratando de lograr, así que si puede orientarme en la dirección correcta, o incluso tratar de armar la solución más básica para este tipo de problema, estaría muy agradecido.

Finalmente, cuando empiece a funcionar, ¿qué tipo de almacenamiento sería mejor para almacenar los nombres de los jugadores y su sexo? Me gustaría que el usuario pueda mantener la lista de jugadores después de que salga de la aplicación y la reinicie.

¡Gracias por cualquier ayuda! :)

Respuesta

1

Necesitarás usar un adaptador personalizado, que en sí mismo debería poder rastrear el indicador masculino/femenino para cada una de sus entradas.

Su método no funcionará ya que el estado de los botones es administrado por el método getView del adaptador. Incluso si los cambia hurgando entre los niños, la próxima vez que se llame al método getView, va a echar a perder las cosas.

+0

Gracias, sospeché que tenía que hacer algo en esta línea; gracias por aclarar esto maravillosamente :) –

1

Mucho de esto depende de cuántos jugadores esperas tener en tu juego. Si es un número que probablemente cabría en una pantalla (o muy cerca), el ListView es realmente innecesario. ListView y los adaptadores no son realmente un método de conveniencia, sino una herramienta para mejorar el rendimiento. Solo guardan en la memoria lo que está en la pantalla y recicla las viejas, ya visualizadas View s para las nuevas filas cuando se desplaza: esta es la razón por la cual algunos de los estados de sus botones se están copiando en filas diferentes.

Hay un par de maneras en que podría solucionar este problema:

  • Se puede escribir un adaptador a medida a sí mismo como sugiere Kumar Bibek. En este adaptador, querrá anular el método getView() para asegurarse de que cada botón tenga el estado correcto cada vez que se llame al método.

  • También podría simplemente usar un ScrollView poblado con algunas de sus filas manualmente si no tiene suficientes datos para garantizar el uso de un ListView. De esta forma no tendrías que preocuparte de que tus filas sean recicladas y de que los estados de los botones estén fuera de control.

Además, es posible que desee ver en el uso de un RadioGroup para el selector de género (no puedo pensar en un mejor uso de los botones de radio, ya que están hechos para ser mutuamente excluyentes).

Además, el LinearLayout exterior en su archivo XML de fila parece innecesario.

En cuanto al almacenamiento, puede usar una base de datos SQLite o SharedPreferences. SharedPreferences no requiere configuración, pero creo que una base de datos SQLite es más adecuada para sus necesidades.

+0

Muchas gracias, creo que voy a seguir su consejo con el Grupo de Radio y un ScrollView. ¡Gracias un montón! : D –

+0

De nada. Cuando recibe una respuesta que le satisface, siempre debe marcarla como la respuesta correcta haciendo clic en la marca de verificación vacía al lado. Una vez que haya hecho algunas preguntas, su "porcentaje de aceptación" aparecerá en su credencial de usuario, y un alto porcentaje alentará a otras personas a brindarle respuestas de calidad. :) –

Cuestiones relacionadas