2010-02-02 18 views
19

Soy bastante nuevo en el desarrollo de Android y todavía estoy resolviendo muchas cosas.Android: Cómo deshabilitar los elementos de la lista en la creación de la lista

Tengo un menú principal que muestra el uso del siguiente código, pero no encuentro la forma de desactivar los elementos seleccionados en el menú. ¿Alguien puede ayudarme con un código de muestra?

public class listTest extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedState) { 
     super.onCreate(savedState); 
     setListAdapter(ArrayAdapter.createFromResource(this, R.array.mainMenu, 
       android.R.layout.simple_list_item_1)); 
     //not sure how to disable list items here 
    } 

    protected void onListItemClick(ListView list, View view, int position, long id) { 
     // can disable items when they are clicked on 
     view.setEnabled(false); 
    } 

} 

y tengo una string-array en mi archivo strings.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="mainMenu"> 
     <item>Item 1</item> 
     <item>Item 2</item> 
     <item>Item 3</item> 
    </string-array> 
</resources> 

Gracias

+0

Un par de aclaraciones rápidas: si desea un menú, aparece cuando el usuario presiona la tecla Menú, luego verifica el método 'onCreateOptionsMenu' en su' Activity'. Además, no debería necesitar mantener el contexto de la aplicación así; una 'Activity' ya extiende' Context' (como puede ver en su llamada a 'createFromResource (this, ...)'. –

+0

Quiero un menú principal que se muestre cuando la aplicación se abra por primera vez, por lo que las opcionesMenú y contextMenu no son buenos tengo la lista visualización y puedo desactivar los artículos cuando se han hecho clic en:. \t protected void onListItemClick (lista ListView, vista, posición int, long id) { \t \t vista. setEnabled (falso);.. } \t pero no tengo ni idea de cómo configurar un elemento de lista seleccionado para discapacitados en onCreate que se especifican en el contexto de aplicación - gracias – Martyn

Respuesta

43

Para deshabilitar los elementos de la lista en la creación de la lista, debe crear una subclase de ArrayAdapter. Debe anular los siguientes métodos: isEnabled(int position) y areAllItemsEnabled(). En el anterior devuelve true o false dependiendo de si el elemento de la lista está habilitado o no. En este último, devuelve false.

Si desea utilizar createFromResource(), deberá implementar también ese método, ya que el ArrayAdapter.createFromResource() todavía crea instancias de ArrayAdapter en lugar de su propio adaptador.

Por último, el código sería algo como lo siguiente:

class MenuAdapter extends ArrayAdapter<CharSequence> { 

    public MenuAdapter(
      Context context, int textViewResId, CharSequence[] strings) { 
     super(context, textViewResId, strings); 
    } 

    public static MenuAdapter createFromResource(
      Context context, int textArrayResId, int textViewResId) { 

     Resources  resources = context.getResources(); 
     CharSequence[] strings = resources.getTextArray(textArrayResId); 

     return new MenuAdapter(context, textViewResId, strings); 
    } 

    public boolean areAllItemsEnabled() { 
     return false; 
    } 

    public boolean isEnabled(int position) { 
     // return false if position == position you want to disable 
    } 
} 
+15

Tenga cuidado con esta solución. La documentación de BaseAdapter establece lo siguiente "Devuelve verdadero si el elemento en la posición especificada no es un separador". Eso significa que si devuelve falso, el artículo es un elemento separador. Algunos teléfonos no pueden dibujar el android: divisor entre un elemento normal y un elemento separador. – Janusz

+0

@Janusz sí, me enfrenté a este problema de la línea divisora, ya que cuando deshabilité el elemento en algún índice, la línea divisora ​​desapareció. Así que hice que la vista en el índice fuera un poco gris para parecer deshabilitada :) –

+0

@AliImran: ¿pueden explicar un poco más cómo manejó este problema con el divisor no dibujado? Gracias – dentex

11

Creo que si un elemento de la lista está habilitado o no es parte del estado de ese elemento, por lo Supongo que tienes que gestionar eso en tu ListAdapter. Al crear subclases de un adaptador, puede anular isEnabled(position). Para cualquier posición que devuelva cierto aquí, ListView marcará este elemento como deshabilitado.

Así que lo que quiere hacer es algo como esto:

class MenuAdapter extends ArrayAdapter<String> { 

    public boolean isEnabled(int position) { 
     // return false if position == positionYouWantToDisable 
    } 

} 

Probablemente esto requiere, por ejemplo, a Map administrando el estado habilitado de cada elemento si desea poder habilitar/deshabilitar un elemento usando un setter.

Luego configure el adaptador personalizado en su ListView.

+0

gracias por su respuesta, esta se ve bien pero tiene problemas para implementarlo. setListAdapter (MenuAdapter.createFromResource (this, R.array.mainMenu, android.R.layout.simple_list_item_1)); MenuAdapter mainMenuList = (MenuAdapter) getListAdapter(); mainMenLList.isEnabled (2); // solo configuró para devolver false atm ¿Alguna idea de dónde me estoy equivocando? actualmente solo se bloquea – Martyn

+0

Bueno, ¿cuál es la excepción que está recibiendo? – Matthias

+0

02-03 13: 51: 21.971: ERROR/AndroidRuntime (1365): java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo {com.martyn.test/com.martyn.test.test}: java.lang.ClassCastException: android.widget.ArrayAdapter – Martyn

6

Usted puede desactivar un elemento de la lista (= hacer que no responde a los toques) llamando tanto

setClickable(false) 

y

setFocusable(false) 

en su adaptador, por ejemplo.

De forma predeterminada, esto no se refleja automáticamente de forma gráfica.

Actualmente estoy usando eso en una lista cuyos elementos de la lista no se pueden hacer clic pero la mayoría de ellos contienen widgets que se pueden hacer clic. Funciona bien.

De esta forma, los elementos de la lista se dibujan normalmente, incluido el separador (consulte la respuesta de Janusz a la respuesta aceptada más arriba).

+0

¿Podría ser más específico? ¿Dónde en el adaptador llamas esto? Su respuesta parece muy prometedora, pero no tengo ni idea de cómo implementarla ... – Pooks

+1

He implementado una subclase de 'BaseAdapter' que infla el diseño de la celda de la lista en su método' getView'. En el diseño XML, el elemento raíz es (en mi caso) un 'LinearLayout' que no se puede enfocar ni hacer clic:' android: focusable = "false" 'and' android: clickable = "false" ' – Raginmari

+0

También puedes hacer esto en el código en el método 'getView' de su adaptador llamando' setClickable (false) 'y' setFocusable (false) 'en la vista que representa su elemento de la lista. – Raginmari

-3

O en forma simple de registrar y registrar OnItemClickListener puede ser una mejor idea.

Para registrarse:

lstDevice.setOnItemClickListener (contexto);

Para cancelar el registro:

lstDevice.setOnItemClickListener (null);

+0

no entendiste la pregunta ... – Siddharth

Cuestiones relacionadas