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).
no puedo averiguarlo ninguna de estas dos cosas me ayudaron: http: // stackoverflow .com/questions/18237218/android-listview-onitemclicklistener-being-blocked-by-progressbar –