Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onItemClickListener not firing on custom ArrayAdapter

Tags:

I have an Activity that retrieves data from a web service. This data is presented in a ListView via an ArrayAdapter which inflates a RelativeLayout with three TextViews inside, nothing fancy and it work fine.

Now I want to implement a Details Activity that should be called when a user clicks an item in the ListView, sounds easy but I can't for the life of me get the onItemClickListener to work on my ArrayAdapter.

This is my main 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));             } 

My ArrayAdapter code:

// 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 

The 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> 

The 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> 

Been messing with this for the last couple of hours and I can't seem to get my head around what the problem is. My problem looks very similar to this question, but I'm not extending ListActivity, so I still don't know where my onListClickItem() should go.

UPDATE: Now I've puzzled with this for several days and still can't find the issue.

Should I rewrite the activity, this time extending ListActivity instead of Activity? Because it provides the onItemClick method itself and is probably easier to overwrite.

Or, should I bind a listener directly in each getView() in my ArrayAdapter? I believe I have read this is bad practice (I should do as I tried and failed in my post).

like image 980
cvaldemar Avatar asked Apr 02 '11 22:04

cvaldemar


1 Answers

Found the bug - it seems to be this issue. Adding android:focusable="false" to each of the list_item.xml elements solved the issue, and the onclick is now triggered with the original code.

like image 100
cvaldemar Avatar answered Jan 05 '23 22:01

cvaldemar