onItemClickListener未在自定义ArrayAdapter上触发

我有一个Activity ,它从Web服务中检索数据。 这个数据通过ArrayAdapter在ListView显示,它通过内部三个TextViewsRelativeLayout进行膨胀,没什么特别的,它可以正常工作。

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

这是我的主要Activity

 public class Schema extends Activity { private ArrayList lessons = new ArrayList(); 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 { 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 { private ArrayList lessons; public LessonListAdapter(Context context, int textViewResourceId, ArrayList 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

            

list_item.xml

       

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

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

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

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

Solutions Collecting From Web of "onItemClickListener未在自定义ArrayAdapter上触发"

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

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

什么对我有用:

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

  

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

  

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

就在返回视图之前我说:

 v.setOnClickListener(listener); 

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

但我必须告诉你,问题是因为平台,这是一个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 } }); }