2011-04-02 21 views
20

Tengo un Activity que recupera datos de un servicio web. Esta información se presenta en un ListView a través de un ArrayAdapter que infla un RelativeLayout con tres TextViews dentro, nada elegante y funciona bien.onItemClickListener no se activa en ArrayAdapter personalizado

Ahora quiero implementar un Detalles Activity que se debe invocar cuando un usuario hace clic en un elemento en el ListView, suena fácil pero no puedo por el momento obtener el onItemClickListener para trabajar en mi ArrayAdapter.

Este es mi principal Activity:

public class Schema extends Activity { 

    private ArrayList<Lesson> lessons = new ArrayList<Lesson>(); 
    private static final String TAG = "Schema"; 
    ListView lstLessons; 
    Integer lessonId; 

    // called when the activity is first created. 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     // can we use the custom titlebar? 
     requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

     // set the view 
     setContentView(R.layout.main); 

     // set the title 
     getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); 

     // listview called lstLessons 
     lstLessons = (ListView)findViewById(R.id.lstLessons); 

     // load the schema 
     new loadSchema().execute(); 

     // set the click listeners 
     lstLessons.setOnItemClickListener(selectLesson);  

    }// onCreate 

// declare an OnItemClickListener for the AdapterArray (this doesn't work) 
private OnItemClickListener selectLesson = new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int i, long l) { 
     Log.v(TAG, "onItemClick fired!"); 
    }     
}; 

private class loadSchema extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog progressDialog; 

    // ui calling possible 
    protected void onPreExecute() { 
     progressDialog = ProgressDialog.show(Schema.this,"", "Please wait...", true); 
    } 

    // no ui from this one 
    @Override 
    protected Void doInBackground(Void... arg0) { 
    // get some JSON, this works fine 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     progressDialog.dismiss(); 
     // apply to list adapter 
     lstLessons.setAdapter(new LessonListAdapter(Schema.this, R.layout.list_item, lessons));   
    } 

Mi código ArrayAdapter:

// custom ArrayAdapter for Lessons 
private class LessonListAdapter extends ArrayAdapter<Lesson> { 
    private ArrayList<Lesson> lessons; 

    public LessonListAdapter(Context context, int textViewResourceId, ArrayList<Lesson> items) { 
     super(context, textViewResourceId, items); 
     this.lessons = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.list_item, null); 
     } 
     Lesson o = lessons.get(position); 

     TextView tt = (TextView) v.findViewById(R.id.titletext); 
     TextView bt = (TextView) v.findViewById(R.id.timestarttext); 
     TextView rt = (TextView) v.findViewById(R.id.roomtext); 

     v.setClickable(true); 
     v.setFocusable(true); 

     tt.setText(o.title); 
     bt.setText(o.fmt_time_start); 
     rt.setText(o.room); 
     return v; 
    } 
}// LessonListAdapter 

El main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/main" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="fill_parent" android:layout_width="fill_parent" 
    android:screenOrientation="portrait" 
    > 

    <!-- student name --> 
    <TextView 
     android:id="@+id/schema_view_student" 
     android:text="Name" android:padding="4dip" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:gravity="center_vertical|center_horizontal" 
     style="@style/schema_view_student" 
    /> 

    <!-- date for schema -->  
    <TextView 
     android:id="@+id/schema_view_title" 
     android:layout_height="wrap_content" 
     android:layout_margin="0dip" 
     style="@style/schema_view_day" 
     android:gravity="center_vertical|center_horizontal" 
     android:layout_below="@+id/schema_view_student"   
     android:text="Date" android:padding="6dip" 
     android:layout_width="fill_parent" 
    /> 

    <!-- horizontal line --> 
    <View 
     android:layout_width="fill_parent" 
     android:layout_height="1dip" 
     android:background="#55000000" 
     android:layout_below="@+id/schema_view_title" 
    /> 

    <!-- list of lessons --> 
    <ListView 
     android:id="@+id/lstLessons" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_below="@+id/schema_view_title" 
    /> 

</RelativeLayout> 

El list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="60px" 
    android:padding="12dip"> 

    <TextView 
     android:id="@+id/timestarttext" 
     android:text="09:45" 
     style="@style/LessonTimeStartText" 

     android:layout_width="60dip" 

     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" 

     android:layout_height="fill_parent" android:gravity="center_vertical|right" android:paddingRight="6dip"/> 

    <TextView 
     android:id="@+id/titletext" 
     android:text="Test" 
     style="@style/LessonTitleText" 

     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 

     android:layout_toRightOf="@+id/timestarttext" 

     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" android:gravity="center_vertical|center_horizontal"/> 

    <TextView 
     android:id="@+id/roomtext" 
     android:text="123" 

     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 

     style="@style/LessonRoomText" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:gravity="center_vertical" /> 

</RelativeLayout> 

Ha estado jugando con esto durante las últimas horas y parece que no entiendo bien cuál es el problema. Mi problema es muy similar al this question, pero no extiendo ListActivity, así que todavía no sé a dónde debería ir mi onListClickItem().

ACTUALIZACIÓN: Ahora me he quedado perplejo con esto durante varios días y todavía no puedo encontrar el problema.

¿Debo volver a escribir la actividad, esta vez extendiendo ListActivity en lugar de Activity? Porque proporciona el método onItemClick en sí mismo y probablemente sea más fácil sobrescribirlo.

O, ¿debo vincular un oyente directamente en cada getView() en mi ArrayAdapter? Creo que he leído que esta es una mala práctica (debería hacer lo que intenté y fallar en mi publicación).

+0

no puedo averiguarlo ninguna de estas dos cosas me ayudaron: http: // stackoverflow .com/questions/18237218/android-listview-onitemclicklistener-being-blocked-by-progressbar –

Respuesta

48

Encontré el error - parece ser this issue. Agregar android:focusable="false" a cada uno de los elementos list_item.xml resolvió el problema, y ​​el onclick ahora se desencadena con el código original.

+4

Me llevó más de una hora encontrar su solución (que funciona). La plataforma Android puede ser brillante, pero esto es una falla total de su parte. –

+0

Es tan extraño que funcionó, esto es deffo un error. –

+0

Parece un problema de trackball/dpad. Pero gracias, este resolvió eso. – Meet

0
protected void onPostExecute(Void result) { 
    progressDialog.dismiss(); stLessons.setAdapter(new LessonListAdapter(Schema.this, R.layout.list_item, lessons)); 
    //add this 
ListView lv = getListView(); lv.setOnItemClickListener(new ListView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> a, View v, int i, long l) { 
        //do stuff 
       } 
      }); 
    } 
+0

"El método getListView() no está definido para el tipo Schema.loadSchema" - no sería lv el mismo que lstLessons de todos modos (lstLessons es el ListView)? – cvaldemar

+0

Creo que puede deberse a que Schema no extiende una ListActivity. – cvaldemar

4

Una vez tuve un problema similar. Cada elemento de la lista tenía una vista de texto y una casilla de verificación, y solo porque la casilla de verificación, el elemento de lista completo no era 'habilitado' para activar el evento. Lo resolví haciendo un pequeño truco dentro del adaptador cuando obtenía la vista.

Justo antes de volver la vista puse:

v.setOnClickListener(listener); 

(El objeto listener es un onItemClickListener di a la constructora Adapter 's).

Pero tengo que decirte, el problema es porque la plataforma, es un error.

+0

Esto funcionó para mí. – jsDebugger

33

Me he encontrado con el mismo problema e intenté solucionarlo pero no pude hacerlo funcionar. Lo que funcionó para mí fue agregar android:descendantFocusability="blocksDescendants" al <RelativeLayout> desde el diseño del artículo xml, list_item.xml en su caso. Esto permite llamar a onItemClick().

+3

android: focusable = "false" y android: desendantFocusability = "blocksDescendants" ambos no funcionaron para mí. – jsDebugger

+4

si hay un 'android: clickable =" true "' eliminarlo. – proxylittle

+0

salvó mi día ... – Deepak

7

Lo que funcionó para mí:

1) Adición de android: descendantFocusability = "blocksDescendants" a la etiqueta de disposición relativa. El resultado se muestra a continuación:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:descendantFocusability="blocksDescendants" > 

2) Adición de android: enfocable = "true" a cada elemento en en list_item.xml ejemplo:

<TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"  
     android:text="TextView" 
     android:focusable="false" /> 
+0

agregando android: descenddantFocusability = "blocksDescendants" al padre del diseño de la celda funcionó para mí – MbaiMburu

1

I tenían el mismo problema y yo probamos para resolverlo agregando

android:focusableInTouchMode="false" 
android:clickable="false" 
android:focusable="false" 

a mi item.xml pero todavía no funciona !!! De hecho me encontré con el problema de la bruja disposición relativa contiene

android:focusableInTouchMode="true" android:focusable="true" 

Y cuando se lo quité todas las cosas está bien

Cuestiones relacionadas