EditText in Listview loses focus when pressed on Android 4.x
Solution 1
A classic hack for situations like this is to use a handler and postDelayed()
. In your adapter:
private int lastFocussedPosition = -1;
private Handler handler = new Handler();
public View getView(final int position, View convertView, ViewGroup parent) {
// ...
edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (lastFocussedPosition == -1 || lastFocussedPosition == position) {
lastFocussedPosition = position;
edittext.requestFocus();
}
}
}, 200);
} else {
lastFocussedPosition = -1;
}
}
});
return convertView;
}
This works on my device, but keep this code out of production. I also wouldn't be surprised if the focus bug manifests itself differently in different android versions or roms.
There are also many other problems with embedding an EditText
within a ListView
that have solutions that feel like a hack. See all of the other people struggling.
It's also very easy to have something like this happen:
.
After having gone down similar paths many times myself, I've mostly given up on trying to override any of the default keyboard behaviours or quirks. I would recommend trying to find alternative solution in your app if possible.
Have you considered having the ListView
rows be just a styled TextView
and then displaying a Dialog
with an EditText
when a row is clicked, updating the TextView as necessary?
Solution 2
I was having problems with the ActionBar "stealing" focus when I pressed on an EditText located within a ListView row. The above solutions did not work, but the following solution worked for me:
http://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html
Basically I added this to my ListView:
android:descendantFocusability="beforeDescendants"
and added this to my activity:
android:windowSoftInputMode="adjustPan"
Solution 3
Modify your manifest xml to add windowSoftInputMode in your activity:
<activity
android:name=".YourActivity"
android:windowSoftInputMode="adjustPan">
</activity>
Solution 4
I know its a very old thread but this answer might be helpful to someone so here it is:
Switch to RecyclerView and you won't have to worry about these annoying issues of ListView. Instead of making new view it recycles and reuses old views.
Solution 5
I was having the same problem with recyclerView
and trying all suggested solutions.
Finally, the problem on my case was that the recyclerView
had wrap_content
as value for the height on my XML by accident; changed it to match_parent
and started working as expected, no focusable
value set and using android:windowSoftInputMode="adjustResize"
Display name
Updated on February 22, 2021Comments
-
Display name about 3 years
I know there are a lot of similar questions out here but I couldn't get any of the provided solutions working in a simple sample app.
The problem occurs when the softkeyboard is shown for the first time. As soon as it is shown, only by pressing the editText again makes it editable.
Tried the following:
android:windowSoftInputMode="adjustPan|adjustResize"
This is not solving any issues. It seems that this line is mandatory to have the activity resized after the softkeyboard is popping up. Unfortunately, it's also causing any EditTexts to lose focus. This is probably to the ListView itself gaining focus after the resizing process. So I tried the following workaround:
listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
This always causes the first visible EditText that the
ListView
contains to gain focus, which is undesirable. The second EditText in the second row should instead gain focus when pressed, which is not happening. Also, if I eventually managed to focus another EditText other then the first one shown (e.g. by pressing 'Next' on thesoftkeyboard
), the first visible one will receive focus after the keyboard is dismissed and the ListView being resized to its full size again.I tried several other things like intercepting
onFocusChange()
events for the ListView, while knowing which EditText was pressed by itsTouchListener
. Requesting the focus for that certain EditText again did not lead to any success either.Using a
ScrollView
instead of aListView
as suggested by other users is not an option either for the concerned project. -
Display name over 10 yearsThanks for your answer, unfortunately we can't change the layout in our app, so we have to use listViews for this porpuse. And we already use the dialogs atm for entering text :) A lot of the answers to the questions are accepted though, I wonder if it worked for thise people
-
Rick over 9 yearsThis will cause the keyboard to block the EditText if it's at the bottom of the list
-
ghybs over 8 yearsWelcome to SO! Please realize this question dates from 2013 (almost 2 years ago). You can still answer of course, especially when techniques and available functions evolve and open room for better solutions. In that case, please provide more detailed explanation on why it would be better than the previous solutions. Finally, please kindly reproduce the essential of the solution here, as a link may become invalid and prevent future users from accessing the resource.
-
Kyle Ivey over 8 years@GrafOrlov you probably don't want to use this solution in production. Consider showing an edittext in a dialog when a row is clicked.
-
Pēteris Caune about 8 yearsThis is the best option IMHO. The other solutions are only workarounds. They don't change the fact that ListView creates/destroys views en masse during
notifyDataSetChanged
. With RecyclerView, you notify about individual inserts, updates, and deletes. The focused view is not being recreated so no issues with focus. -
sudoExclaimationExclaimation almost 8 years@KyleIvey can you help answer this question please? stackoverflow.com/questions/37358015/…
-
Gabe Sechan over 7 years@PēterisCaune Listview doesn't destroy views en masse ever, it recycles. And 99% of the recycler view code I've ever seen just does the same thing. Recycler view can be more focused, but in practice its just easier not to do it that way.
-
Omer almost 7 yearsHappens in a recycler view as well
-
drmrbrewer almost 3 yearsI agree. I tried EVERYTHING to fix the behaviour of
EditText
inListView
, and NOTHING worked. I migrated to usingRecyclerView
(see developer.android.com/guide/topics/ui/layout/recyclerview) and it all works like a dream, with no nasty hacks. And the migration was easy because I was already using theViewHolder
model in myListView
adapter.