Cómo implementar una selección única o múltiple de varios elementos en una lista personalizada
Método de selección de radio: (Este método también se aplica a los botones de opción)
main.xml
lt? versión xml = "1.0" codificación = "utf-8"? gt
diseño lineal xmlns: Android = "/apk/RES/Android "
Android: diseño _ ancho = " match _ parent "
Android: diseño _ altura = " match _ parent "
android:orientation="vertical"
gt
ltimageview
android:id =" @ id/img "
Android: diseño _ ancho = " relleno _ padre "
Android: diseño _ altura = " ajuste _ contenido "
Android: src = " @ drawable/triangle 16 blue " / gt;
vista de lista lt
android: id="@ id/lvGroup "
Android :layout_width = "fill_parent"
Android:layout_height = "fill_parent"
Android:background = "@drawable/down button_corner"/gt ;
lt/diseño lineal gt; ltlinear diseño xmlns: Android = "/apk/RES/Android "
Android: diseño _ ancho = " fill _ parent "
Android:layout_height = "fill_parent" p>
Android:orientation = "horizontal" gt;
vista lttext
android:id ="@ id/item_tv "
android: textSize ="18sp "
android:layout_width="0dp "
Android:layout_height = " wrap_content "
android:layout_weight="1 " p>
Android: gravedad = "centro_vertical"/ gt
lt test box
android: id="@ id/item_cb "
Android: diseño _ ancho = " ajuste _ contenido "
Android: diseño _ altura = " ajuste _ contenido "
android:focusable="false "
android:clickable="false "
Andro
id: focusableInTouchMode = " false "
Android: gravedad = " center_vertical "/gt;
lt/diseño lineal gt;MainActivity.java
Clase pública MainActivity extiende Actividad {
Cadena final estática privada TAG = " MainActivity
ListView privado listView
Lista de matriz privada lt String gt grupo;
@Override
public void on create(Estado de instancia guardado del paquete){
super . /p>
listView =(listView)this . findviewbyid(r . id . list);
grupos = new ArrayList lt string gt();
groups . " 11 ");
grupos . agregar(" 22 ");
grupos . agregar(" 33 "); ");
grupos. add(" 55 ");
grupos. add(" 66 ");
grupos. add (" 77 ") ;
adaptador de grupo = nuevo adaptador de grupo (este, grupos);
listView.setAdapter (adaptador);
listview . /p>
OnItemClickListener listItemClickListener = new OnItemClickListener(){
@Override
public void onItemClick(adapter view lt;? gt parent, view view, int position, p>
long id) {
//// Obtenga el objeto ViewHolder, eliminando la necesidad de crear una instancia de cb que necesitamos a través de las capas de findViewById.
portador de vista titular de vista =(portador de vista)view .gettag();
portador de vista toggle() //Cambia el estado seleccionado de CheckBox al actual. estado Invertido, la vista de cuadrícula garantiza que esté seleccionada una sola vez.
}
};
}
}
}
Adaptador de grupo. java
La clase pública GroupAdapter extiende BaseAdapter {
Actividad de actividad privada; //Contexto
Lista de matriz privada lt string gt list; diseño privado inflador inflador = null; //Importar diseño
private int temp =-1;
public GroupAdapter(contexto de actividad, ArrayList lt string gt list) {
this.activity = contexto
this.list = lista
inflater=LayoutInflater.from(contexto);
}
@Override
public int getCount() {
Lista de retorno();
}
@Override p>
Objeto público getItem(int posición) {
Lista de retorno get(posición
}
@Override
. public long getItemId(int position){
//TODO código auxiliar de método generado automáticamente
Posición de retorno;
}
//Esto La función se ejecuta cada vez que //listview muestra una fila de datos.
@Override
Vista pública getView(int position, View convertView, ViewGroup parent) {
ViewHolder titular = null
If ( convertView==null) {//Cuando el control ListView se carga por primera vez, convertView está vacío.
convertir vista = inflar . inflate(r . diseño . grupo _ elemento _ vista, nulo); // Entonces esta declaración se ejecutará cuando el control ListView no se deslice.
titular = nuevo titular de vista();
titular . TV =(TextView)convertir vista . titular .CB =(CheckBox)convertir vista .findviewbyid(r . id . item _ CB
convertir vista .
}
De lo contrario{//Retire el soporte.
holder = (view holder)convert view . gettag(); //Objeto almacenado en esta vista como una etiqueta
}
//Lista de configuración Se muestra la vista de texto.
titular.tv.setTextColor(color.
white);
holder . settext(list . get(position));
//Establezca el estado marcado de la casilla de verificación según isSelected.
holder.cb.setId(position); //Restablece la identificación de la casilla de verificación a la posición actual.
holder . CB . setoncheckedchangelister(new oncheckedchangelister(){
//Establece la última casilla seleccionada en falso.
@Override
public void onchecked cambió (vista de botón compuesto, booleano isChecked) {
If(isChecked){//Implemente la función del botón de opción de la casilla de verificación, que también se aplica al botón de opción. if(temp!=-1){
//Busca la última casilla de verificación en la que se hizo clic y configúrala en falso. Al volver a seleccionar, puedes cerrar la casilla de verificación anterior
CheckBox temp CheckBox =. (CheckBox)actividad. findviewbyid(temp);
if(tempCheckBox!=empty)
temp casilla de verificación marcada
}
temp = botón vista . getid(); //Guarda el valor de identificación de la casilla de verificación actualmente seleccionada
}
}
. });
//sistema . println(" temp:" temp);
//system . println(" posición:" posición);
If(position==temp)//Compare si la posición es consistente con la temperatura actual.
titular CB . conjunto marcado(verdadero);
Otros
titular CB . convertView
}
Visor de categorías estáticas {
TextView TV;
Casilla de verificación CB;
} p>
}
La casilla de verificación Listview implementa múltiples cuadros de selección
MainAcitvity.java
La clase pública MainActivity extiende la actividad {
Cadena final estática privada TAG = " MainActivity
ListView privado listView
Lista de matriz privada lt cadena gt grupo;
@override p>
público void on create(Estado de instancia guardado del paquete){
super .oncreate(savedInstanceState);
setContentView(r . layout . main); )this .findviewbyid(r . id . list);
grupos = new ArrayList lt string gt()
grupos ;
grupos . agregar(" 22 ");
grupos . grupos . agregar(" 55 ");
grupos . agregar(" 66 "
grupos .
adaptador de grupo = nuevo adaptador de grupo(este, grupos);
listView.setAdapter(adapter);
listview.setonitemclicklistener(listItemClickListener);
OnItemClickListener listItemClickListener = new OnItemClickListener(){
@override
public void onItemClick(adapter view lt;? gt parent, view view, int position,
long id) {
////Obtiene el objeto ViewHolder, eliminando la necesidad de crear una instancia del cb que necesitamos a través de las capas de findViewById Pasos de ejemplo.
portador de vista titular de vista =(portador de vista)view .gettag();
portador de vista toggle() //Cambia el estado seleccionado de CheckBox al actual. estado Invertido, la vista de cuadrícula garantiza que esté seleccionada una sola vez.
GroupAdapter.getIsSelected().
put(posición, titular de la vista. CB. está marcado()); //Registra el estado marcado de la casilla de verificación.
}
};
}
}
GroupAdapter.java
La clase pública GroupAdapter extiende BaseAdapter {
Contexto de contexto privado; //Contexto
Lista de matriz privada lt string gt list
//Casilla de verificación de control elija.
HashMap estático privado lt entero, booleano gtisSelected
diseño privado inflador inflador = null; //Importar diseño
public GroupAdapter(Contexto de contexto, ArrayList lt cadena de caracteres lista gt){
this.context = contexto
this.list = lista
inflater=LayoutInflater.from(context);
isSelected = new HashMap lt entero, booleano gt();
initData();
}
Private void initData(){//Inicialización de datos seleccionados. .
for(int I = 0;i ltlist . size();i ){
getIsSelected(). put(i,false);
}
}
@override
public int getCount() {
Lista de retorno tamaño();
}
@Override
Objeto público getItem(posición int) {
Lista de retorno. .get(position);
}
@override
public long getItemId(int position){
//TODO generado automáticamente Stub de método
Posición de retorno;
}
//Esta función se ejecuta una vez cada vez //listview muestra una fila de datos.
@Override
Vista pública getView(int position, View convertView, ViewGroup parent) {
ViewHolder titular = null
If ( convertView==null) {//Cuando el control ListView se carga por primera vez, convertView está vacío.
convertir vista = inflar .inflate(r . diseño . grupo _ elemento _ vista, nulo); // Entonces esta declaración se ejecutará cuando el control ListView no se deslice.
titular = nuevo titular de vista();
titular .TV =(TextView)convertir vista .findviewbyid(r . id . item _ TV
); titular .CB =(CheckBox)convertir vista .findviewbyid(r . id . item _ CB
convertir vista .
}
De lo contrario{//Retire el soporte.
holder = (view holder)convert view . gettag(); //Objeto almacenado en esta vista como una etiqueta
}
//Lista de configuración Se muestra la vista de texto.
holder.tv.setTextColor(color.white);
holder . settext(list . get(position));
//Según isSelected Establece el estado marcado de la casilla de verificación.
titular . CB . set check(getIsSelected(). get(position));
Devolver convertView
}
Categoría estática. Visor {
TextView TV;
Casilla de verificación CB;
}
HashMap estático público ltInteger, booleano gtgetIsSelected( ){
return isSelected
}
public static void setIsSelected(HashMap lt; integer, Boolean gtisSelected){
el adaptador de grupo está seleccionado = está seleccionado. ;
}
} Entre ellos, getview es responsable de mostrar cada fila del elemento de la vista de lista, y getview se ejecuta una vez que se muestra cada fila.
Si desea realizar una única selección, debe guardar el valor de posición de la casilla de verificación actualmente seleccionada y compararlo con la posición de cada elemento en la vista de lista. Establezca la casilla de verificación ischeck=true solo si son iguales
Solo el setOnCheckChangeListener de la casilla de verificación puede hacer esto, guardar el último valor de posición en el que se hizo clic y restablecer el valor de identificación de la casilla de verificación. temp guarda el valor de identificación.
Getview es responsable de mostrar datos y onitemselectedlistener es responsable de enviar mensajes, extraer datos y procesar datos.