为什么在自定义列表视图中不能与setOnItemClickListner一起使用?

时间:2018-07-18 09:30:31

标签: java android list listview

我有一个列表视图,其中每行listView.setOnItemClickListener()都有两个文本视图和一个编辑文本。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               Log.e("position", String.valueOf(position));
           }
       });

Log.e("position", String.valueOf(position));未显示在Logcat上

3 个答案:

答案 0 :(得分:1)

如果您的项目与Model一起提供,则可以像下面的代码一样在setOnItemCLickListner中创建模型的对象,然后根据位置从模型中获取数据。

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                        ActivityModel booking = movieList.get(position);
                        String id = booking.getActivityId();
                        Toast.makeText(this, id , Toast.LENGTH_LONG).show();

                    }
                });

在您的XML中,在列表视图中添加以下属性。

android:focusable="false"

答案 1 :(得分:1)

我认为重点是EditText。在XML中,将其添加到您的editText视图android:focusable="false"

进一步阅读:https://stackoverflow.com/a/8955441/5954246

答案 2 :(得分:1)

这是因为editText占用了您的焦点,因此没有点击被注册。

当我为EditText设置android:focusable="false"时,ListView项上的onItemClick起作用,但是当我在内部单击时,EditText不会获得光标。

如果我将android:focusable="true"设置为EditText,则EditText是可聚焦的,但是单击ListView的onItemClick无效。

因此以这种方式修改适配器:

    public class AdapterListCards extends CursorAdapter implements View.OnTouchListener {
 public AdapterListCards(Context context) {
    super(context, null, true);
 }

 @Override
 public boolean onTouch(View view, MotionEvent motionEvent) {
    if (view instanceof EditText) {
        EditText editText = (EditText) view;
        editText.setFocusable(true);
        editText.setFocusableInTouchMode(true);
    } else {
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.edtCode.setFocusable(false);
        holder.edtCode.setFocusableInTouchMode(false);
    }
    return false;
 }

 private class ViewHolder {
    TextView txtName;
    EditText edtCode;
}

 @Override
 public View newView(final Context context, Cursor cursor, ViewGroup parent) {
    View convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
    final ViewHolder holder = new ViewHolder();
    holder.txtName = (TextView) convertView.findViewById(R.id.txt_name);
    holder.edtCode = (EditText) convertView.findViewById(R.id.pass);
    holder.edtCode.setOnTouchListener(this);
    convertView.setOnTouchListener(this);
    convertView.setTag(holder);

    return convertView;
 }

@Override
public void bindView(View view, Context context, Cursor cur) {
    ViewHolder holder = (ViewHolder) view.getTag();
    if (cur!=null) holder.txtName.setText(cur.getString(cur.getColumnIndex("name")));
 }
}