onItemClickListener不会触发自定义的ArrayAdapter

我有一个Activity ,从Web服务检索数据。 这个数据通过一个ArrayAdapter呈现在一个ListView ,这个ArrayAdapter里面有三个TextViews来扩大RelativeLayout ,没有什么特别的,它可以正常工作。

现在我想实现一个细节Activity ,应该在用户点击ListView中的一个项目时调用,听起来很简单,但是我不能让我的生活中的onItemClickListener工作在我的ArrayAdapter上。

这是我的主要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)); } 

我的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 

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> 

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> 

在过去的几个小时里一直在搞这个,我似乎无法解决问题所在。 我的问题看起来非常类似于这个问题 ,但我没有扩展ListActivity,所以我仍然不知道我的onListClickItem()应该去哪里。

更新:现在我已经困惑了这几天,仍然无法find问题。

我应该重写活动,这次扩展ListActivity而不是活动? 因为它提供onItemClick方法本身,可能更容易覆盖。

或者,我应该在我的ArrayAdapter中的每个getView()中直接绑定一个监听器? 我相信我已经读了这是不好的做法(我应该做的,因为我尝试了,在我的职位失败)。

Solutions Collecting From Web of "onItemClickListener不会触发自定义的ArrayAdapter"

发现错误 – 这似乎是这个问题 。 为每个list_item.xml元素添加android:focusable="false"解决了这个问题,现在触发onclick与原始代码。

我遇到了同样的问题,并尝试了你的修复,但无法让它工作。 对我来说,在你的案例中,将android:descendantFocusability="blocksDescendants"到项目布局xmllist_item.xml中的<RelativeLayout>中。 这允许onItemClick()

什么对我有效:

1)将android:descendantFocusability =“blocksDescendants”添加到Relative Layout标签。 结果如下所示:

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

2)向list_item.xml中的每个元素添加android:focusable =“false”示例:

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

一旦我有类似的问题。 每个列表项都有一个文本视图和一个checkbox,只是因为checkbox,整个列表项没有“ 启用 ”来触发事件。 当我获得视图时,我通过在适配器内部制作一个小技巧来解决这个问题。

在返回视图之前,我说:

 v.setOnClickListener(listener); 

(对象listener是一个onItemClickListener我给了Adapter的构造函数)。

但是我必须告诉你,问题是因为这个平台,这是一个bug。

我有同样的问题,我试图通过添加解决它

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

到我的item.xml但它仍然无法正常工作! 事实上,我发现在相对布局女巫包含的问题

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

当我删除它所有的东西都可以

 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 } }); }