У меня есть несколько edittext в списке. У меня есть общий фокусщик на edittext, который обновляет значение модели данных, а также фон edittext, когда фокус теряется, вызывая notifydatachanged. Проблема в том, что если один из edittext удерживает фокус, когда я касаюсь следующего edittext, он мгновенно набирает фокус, а затем теряет фокус. Я подозреваю, что это связано с вызовом метода notifydatachanged, который вызывает перерисовывание всех просмотров, после чего фокус теряется. Кто-нибудь имеет предложение или работу по этому вопросу? Спасибо.
Android edittext в listview теряет фокус на вызове notifydatachanged
Ответ 1
Это действительно происходит потому, что все представления перерисовываются, поэтому текст редактирования, представляющий любую строку, которая была сфокусирована, теперь представляет собой совершенно другой объект. Задайте переменную в вашем адаптере: int nowFocusedRow;
в getView для вашего адаптера: добавьте прослушиватель onFocusChanged для каждого текста редактирования и, когда этот текст редактирования получит фокус, установите в настоящее времяFocusedRow = любую строку, в которой находится сфокусированный текст редактирования. Также установите любой текст редактирования, который находится в текущейFocusedRow, чтобы быть сосредоточены.
Ответ 2
Set
android:windowSoftInputMode="adjustPan"
для вашей деятельности в AndroidManifest.xml
Ответ 3
У меня также была проблема с EditText, потерявшей фокус, но вызов setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS)
решил.
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final ListView lv = getListView();
lv.setDescendantFocusability(ListView.FOCUS_AFTER_DESCENDANTS);
}
Ответ 4
Для будущих пользователей все здесь сложно. Правильный ответ: добавить
android:descendantFocusability="afterDescendants"
в список.
Ответ 5
Пример реализации предложения Сэма Джадда с дополнительным переключателем use_last_focus
public class my_friends_adapter extends ArrayAdapter<group_user> {
boolean use_last_focus=false;
int currentlyFocusedRow=-1;
String currentlyFocusedField="";
public my_friends_adapter(Context context, int resource, ArrayList<group_user> users) {
super(context, resource, users);
}
EditText tvName,tvEmail;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) convertView = LayoutInflater.from(getContext()).inflate(R.layout.my_friends_item, parent, false);
tvName = (EditText) convertView.findViewById(R.id.tvName);
tvEmail = (EditText) convertView.findViewById(R.id.tvEmail);
if (use_last_focus && currentlyFocusedRow ==position){
if (currentlyFocusedField=="tvName")tvName.requestFocus();
else tvEmail.requestFocus();
use_last_focus=false;
}
tvName.setTag(position);//When focus is lost save the entered value for later use
tvName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {save_data2( v, hasFocus);
}
});
tvEmail.setTag(position);//When focus is lost save the entered value for later use
tvEmail.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {save_data2( v, hasFocus);}
});
return convertView;
}
public void save_data2(View v, boolean hasFocus){
int position = (Integer) v.getTag();
EditText tvName1 = (EditText) v.findViewById(R.id.tvName);
EditText tvEmail1 = (EditText) v.findViewById(R.id.tvEmail);
boolean data_changed=false;
if (hasFocus) currentlyFocusedRow=position;
if (!(tvName1==null)) {
if (hasFocus) currentlyFocusedField="tvName";
}
if (!(tvEmail1==null)) {
if (hasFocus) currentlyFocusedField="tvEmail";
}
// set when data_changed
// ..........
if (!hasFocus && data_changed) {
//your code to save the changed data
// ...............
//
my_friends.adapter.notifyDataSetChanged();
use_last_focus=true;
}
}
}