Focusable EditText in the ListView and onItemClick
Asked Answered
C

3

14

In each ListView item I have EditText.

When I set android:focusable="false" for EditText then onItemClick on the ListView item is working, but EditText doesn't get cursor when I click inside.

If I'll set android:focusable="true" for EditText, then EditText is focusable, but onItemClick for the ListView doesn't work when I click on it.

How to separate onItemClick and focusable EditText in this item?

Clasping answered 23/8, 2012 at 10:49 Comment(11)
And what about if your remove android:focusable attribute from EditText?Vatic
I think it happens because when you apply android:focusable="true" to EditText then the onItemClick of ListItem dispatch to only EditText. And the Event is not passed to it Parent List Item View.Vatic
@Vatic behavior is the same as android:focusable="true". i.e. EditText is focusable, but onItemClick for the ListView doesn't work when I click on it.Clasping
@Vatic I think so to :) But how to overcome it?Clasping
Leave the EditText without any focusable attribute and then add to the activity android:windowSoftInputMode="adjustPan" in the manifest. This should solve the focus problems.Inelegance
possible duplicate of Android: EditText in ListViewInelegance
@Vatic I can't give the code :(Clasping
@Luksprog my ListView is in Fragment that I put in ViewPager that I am using in FragmentActivity. For this FragmentActivity in Manifest I set <activity android:name=".activities.MainTabs" android:launchMode="singleTop" android:configChanges="orientation|screenSize" android:windowSoftInputMode="adjustPan"> and when I deleted focusable attribute it didn't helped.Clasping
Can you try this, setOnTouchListener() to EditText and override onTouch() in onTouch just return false... ? And let me know what happen...Vatic
@Luksprog you can write in EditText and your onItemClick is working too?Clasping
No, I'm sorry I misread your question.Inelegance
C
15

Thanks @user370305 for the idea with OnTouchListener. Now it is working for me by using 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")));
 }
}

and of course: android:windowSoftInputMode="adjustPan" for activity in the manifest.

Clasping answered 23/8, 2012 at 16:38 Comment(1)
Good. Now you can accept your own answer. And +1 from me for implement my suggestion and post it as solution so other users can also find this helpful.Vatic
G
1

My solution:

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

And add

android:descendantFocusability="blocksDescendants"

to the view group in the layout xml file for the list row item.

Galleon answered 28/10, 2013 at 7:18 Comment(0)
W
1

The solution that worked for me was to use the EditText with TextView and a flag in adater indicating edit mode enabled / disabled.

I added the TextView and the EditText in the same position in a relative layout, meaning they would be overlapping one another. The EditText will be hidden by default and TextView will be displayed. In this the item click of listview works flawlessly.

Then I assigned touch listener for TextView and onTouch I hide the textview and display the EditText and requestfocus enabling the input. Even the entire view's on click will request focus for EditText. So no item click shall be enabled.

I have a button in actionbar "Done". Once I click it I update my flag in Adapter saying "modeEdit = false" and call notifydatasetchanges.

In GetView we have check for the flag and if modeEdit = false, then display TextView.

This was only best solution I got to be working!!!

Hope this helps. Let me know if anyone is interested in the working copy of source code.

Weakling answered 18/7, 2017 at 9:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.