14

在我拥有的每个ListView项目中EditText

当我设置android:focusable="false"EditTextthenonItemClick时,该ListView项目正在工作,EditText但当我进入时没有得到光标click

如果我设置android:focusable="true", EditTextthenEditText是可聚焦的,但是当我点击它onItemClickListView它不起作用。

如何在这个项目中分离onItemClick和聚焦?EditText

4

3 回答 3

15

感谢@user370305提供 OnTouchListener 的想法。现在它通过使用为我工作setOnTouchListener()

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

当然:android:windowSoftInputMode="adjustPan"对于清单中的活动。

于 2012-08-23T16:38:34.877 回答
1

我的解决方案:

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    ViewHolder vh = (ViewHolder) view.getTag();
    //vh.row is the convertView in getView or you may call it the row item itself
    ((ViewGroup)vh.row).setDescendantFocusability(view instanceof EditText?ViewGroup.FOCUS_AFTER_DESCENDANTS:ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    return false;
}

并添加

android:descendantFocusability="blocksDescendants"

到列表行项目的布局 xml 文件中的视图组。

于 2013-10-28T07:18:09.007 回答
1

对我有用的解决方案是使用带有 TextView 的 EditText 和 adater 中指示编辑模式启用/禁用的标志。

我在相对布局中的相同位置添加了 TextView 和 EditText,这意味着它们将相互重叠。默认情况下,EditText 将被隐藏,而 TextView 将被显示。在此列表视图的项目单击完美无缺。

然后我为 TextView 和 onTouch 分配了触摸侦听器,我隐藏了 textview 并显示了 EditText 和 requestfocus 启用输入。甚至整个视图的点击都会请求 EditText 的焦点。因此,不应启用任何项目单击。

我在操作栏中有一个按钮“完成”。单击它后,我会在适配器中更新我的标志,说“modeEdit = false”并调用 notifydatasetchanges。

在 GetView 中,我们检查了标志,如果 modeEdit = false,则显示 TextView。

这是我必须工作的唯一最佳解决方案!!!

希望这可以帮助。如果有人对源代码的工作副本感兴趣,请告诉我。

于 2017-07-18T09:32:06.063 回答