В моем случае это происходит потому, что при изменении размера ListView он заново создает все элементы списка (т.е. снова вызывает getView () для каждого видимого элемента списка).
Поскольку EditText находится в макете, который я возвращаю из getView (), это означает, что это экземпляр EditText, отличный от того, который ранее имел фокус. Вторым следствием является то, что когда программная клавиатура появляется или исчезает, я обнаружил, что теряю содержимое EditText.
Поскольку я хотел, чтобы мой вид оставался полностью доступным (т. Е. Я хочу, чтобы его размер был изменен, а не спрятан за окном клавиатуры с некоторыми недоступными частями), я не мог использовать ответ Фрэнка, который в противном случае кажется лучшим подходом.
Я решил эту проблему, используя OnFocusChangeListener в EditText для записи метки времени, когда фокус был потерян, а затем в getView () при воссоздании элемента списка, если текущее время находится в пределах некоторого порога от момента, когда фокус был потерян, вызовите requestFocus (), чтобы вернуть его в рассматриваемый EditText.
Вы также можете извлечь текст из предыдущего экземпляра EditText в этот момент и перенести его в новый экземпляр.
private class MyAdapter<Type> extends ArrayAdapter<String>
implements OnFocusChangeListener
{
private EditText mText;
private long mTextLostFocusTimestamp;
private LayoutInflater mLayoutInflater;
public MyAdapter(Context context, int resource, int textResourceId, ArrayList<String> data, LayoutInflater li) {
super(context, resource, textResourceId, data);
mLayoutInflater = li;
mTextLostFocusTimestamp = -1;
}
private void reclaimFocus(View v, long timestamp) {
if (timestamp == -1)
return;
if ((System.currentTimeMillis() - timestamp) < 250)
v.requestFocus();
}
@Override public View getView (int position, View convertView, ViewGroup parent)
{
View v = mLayoutInflater.inflate(R.layout.mylayout, parent, false);
EditText newText = (EditText) v.findViewById(R.id.email);
if (mText != null)
newText.setText(mText.getText());
mText = newText;
mText.setOnFocusChangeListener(this);
reclaimFocus(mText, mTextLostFocusTimestamp);
return v;
}
@Override public void onFocusChange(View v, boolean hasFocus) {
if ((v == mText) && !hasFocus)
mTextLostFocusTimestamp = System.currentTimeMillis();
}
}