2012-01-11 6 views
5

Estoy intentando establecer un encabezado y un pie de página en mi vista de lista en los que se puedan hacer clic. El problema es que OnClickListener no responde a nada y no puedo entender lo que estoy haciendo mal.Android: No se puede hacer clic en un encabezado/pie de página de ListView

$ View header = getLayoutInflater().inflate(R.layout.header_layout, null, true); 
    getListView().addHeaderView(header); 

    myAdapter = new myAdapter(this); 

    header.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Do what I want when i click it 
     } 
    }); 

actualización
La mejor solución que finalmente ocurrió fue la adición de un botón separado para el diseño de cabecera, y luego hacerlo de esta manera:

View header = getLayoutInflater().inflate(R.layout.header_layout, null); 
Button headerButton = (Button)header.findViewById(R.id.header_button); 
getListView().addHeaderView(header); 

headerButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    // My Click Stuff 
    } 
}); 
+0

Es posible que haya omitido esta línea 'header.setClickable (true)' –

Respuesta

3

veo algunos problemas:

  • al inflar la cabecera, utilice getListView() como segundo parámetro (raíz, donde se tiene nula ahora) l
  • caso de que el encabezado de ser una visión o una ViewGroup? Terminé usando ViewGroup en estas situaciones.
  • finalmente - ¿quizás debería configurar el oyente click en el botón en el encabezado en lugar del encabezado mismo?
+0

La tercera viñeta lo arregló, asegurando también el uso la vista de encabezado al crear el botón. Está más cerca de lo que estaba buscando. – bbedward

8

que necesita para manejar el clic en ListView 's onItemClick. Simplemente verifique si ese es el primer o el último artículo en el adapter y maneje los clics de esa manera. Debe tratarlo como un elemento en el ListView.

0

Creo que la vista de lista y los botones luchan por el enfoque y su lista de la lista es ganadora. tendrá que usar un onTouchListener para los botones.

Hay una alternativa más y es configurar lo siguiente en el pie de página. Hay otra sobrecarga de método creada pero no apareció en los documentos, tuve que verificar la documentación en línea:

mylistView.addFooterView (footerView, null, false);

donde false le dice al pie de página que no se puede seleccionar. Probé esto yo mismo y los botones dentro del pie de página responden a los toques ahora. Espero que esta sea una respuesta aceptable.

3

Existe una manera más fácil solución:

acaba de establecer un "OnClickListener" a la vista aplicado:

View view = inflater.inflate(R.layout.xxx, null); 
view.setOnClickListener(new OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     //do something 
    } 
}); 

cosa muy fácil, que lo resolvió!

0

Lo que funcionó para mí:

Al inflar la vista de encabezamiento, antes de añadir a la vista de lista, a continuación, he usado el fin de obtener la subvista y añadir un detector de clics en él

myHeaderView.findViewById(R.id.myButton).setOnClickListener(new OnClickListener() { ... }); 

también , cuando he añadido a la vista de lista, he utilizado el constructor sobrecargado con el tercer conjunto de variables a true

mListView.addHeaderView(myHeaderView, null, true); 
0

Como dice @LuxuryMode, usted debe manejar la L istView's onItemClick.Aquí es cómo hacerlo:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) { 

// if statement 

} 

Conseguir la cabecera:

if (position == 0) {) 

Conseguir el pie de página:

if (position == adapter.getCount()) {) // if there is no header 
if (position == adapter.getCount() + 1) {) // if there is a header 

Hay otras maneras de hacerlo, también. Aquí hay algunas cosas que se pueden comparar:

arrayList.size() // number of items in the array (if your adapter is using an array) 
cursor.getCount() // number of data items in the cursor (if your adapter is using a cursor) 
adapter.getCount() // number of data items passed in by the cursor (or at least that is what a custom adapter should report) 
listview.getCount() // number of data items from the adapter + a header and/or footer view 

así que usar un encabezado o un pie de página hará que el listview.getCount() mayor de 1 de cursor.getCount(). Si utiliza un encabezado y un pie de página, entonces será mayor por 2.

2

Ejemplo con un pie de página:

mYourListView.addFooterView(footer, null, true); 

Luego, en el OnItemClickListener podrá comprobar:

@Override 
public void onItemClick(AdapterView<?> parent, 
          View view, final int position, final long id) { 

    if (id != -1) { 
     // do whatever you do with list items 
    } else { 
     // do what you need after the footer been clicked 
    } 

(si necesita manejar y el encabezado y el pie de página hacen clic, verifique la posición - 0 para el encabezado y [adapter.getCount() - 1] para el pie de página)

Este enfoque proporcionará el mismo efecto visual ct mientras el pie de página hace clic como si se hubiera hecho clic en el elemento de la lista. (Pero si no necesita ese efecto solo agregue OnClickListener al pie de página e interceptará todos los clics del pie de página)

Cuestiones relacionadas