Android: EditText в выпуске ListView

У меня есть список в моем приложении, которое в основном представляет собой вопросник, поэтому есть некоторые EditTexts, которые пользователь должен заполнить. Я столкнулся со следующими проблемами:

  1. Некоторым из EditText требуется числовой ввод, поэтому я устанавливаю inputType в соответствующем xml-типе как числовое, однако, когда я нажимаю на EditText, отображается цифровая клавиатура, но почти сразу она исчезает и отображается обычная клавиатура.

  2. Как вы можете себе представить, мне нужно сохранить значения, которые пользователь вводит в эти EditTexts. Проблема, с которой я сталкиваюсь, заключается в том, что после ввода некоторого текста в некоторые разделы EditTexts и прокрутки вниз текст исчезает, когда я возвращаюсь. Вы можете видеть в моем коде, что я пытался предотвратить это, и я должен упомянуть, что он отлично работает с флажками.

  3. Вначале у меня были проблемы с потерей фокуса, но я решил, что он рассматривает другие вопросы (добавлен descendantFocusablity = "beforeDescendants" в ListView и windowSoftInputMode = "adjustPan"). Прекрасно работает, за исключением того, что когда EditText находится ниже половины экрана, он теряет фокус, как только я начинаю вводить в него текст. Метод getView для адаптера списка:

    public View getView(final int position,View result,ViewGroup parent) { final ViewHolder vh; final Question question = values.get(position); if(holders[position]==null) vh = new ViewHolder(); else vh = holders[position]; LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(question.getQuestionType().equals(Question.TYPE_CLOSED)) { result = inflater.inflate(R.layout.closed_question_list_item, null); vh.cb = (CheckBox)result.findViewById(R.id.checkbox); vh.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { vh.isChecked = isChecked; holders[position] = vh; } }); vh.cb.setChecked(vh.isChecked); } else { result = inflater.inflate(R.layout.numeric_question_list_item, null); vh.et = (EditText)result.findViewById(R.id.question_et); vh.et.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { vh.tvValue = s.toString(); holders[position] = vh; Log.i(TAG,"Entered afterTextChanged for "+ question.getText()); } @Override public void beforeTextChanged(CharSequence s, int start,int count, int after) { } @Override public void onTextChanged(CharSequence s, int start,int before, int count) { } }); vh.et.setText(vh.tvValue); } vh.tv = (TextView)result.findViewById(R.id.question_text); vh.tv.setText(question.getText()); holders[position] = vh; result.setTag(vh); return result; } 

Solutions Collecting From Web of "Android: EditText в выпуске ListView"

Решения для выпуска № 3:

  1. Установите descendantFocusablity="beforeDescendants" в descendantFocusablity="beforeDescendants" .

  2. Установите windowSoftInputMode="adjustPan" в манифесте

  3. Установите listview.setItemsCanFocus(true)

Чтобы расширить ответ на вышеприведенный ответ aaRBiyecH , вот решение и более подробное объяснение ваших вопросов № 1 и № 3 ( источник ):

Вам необходимо установить свойство DescendantFocusability вашего ListView на «afterDescendants».

Вы можете сделать это в XML следующим образом:

android:descendantFocusability="afterDescendants"

Или в коде:

listview.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

Вам также необходимо настроить элементы для фокусировки.

Вы можете сделать это в коде следующим образом: listview.setItemsCanFocus(true) ;

Кроме того, вам нужно указать, что происходит в главном окне вашей активности, когда отображается мягкая клавиатура. Это делается путем изменения атрибута WindowSoftInputMode . Вероятно, вы захотите установить его в AdjustPan, чтобы ваш список не был изменен, и, таким образом, GetView снова не вызывается. Вероятно, это происходит сейчас, когда вы скрываете клавиатуру, GetView вызывается снова и сбрасывает исходное значение в EditText.

Вы можете сделать это, используя атрибут android:windowSoftInputMode="adjustPan" в XML- getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN) основного класса активности или getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN) программно.

Из-за вопроса 2 вы можете относиться к этому сообщению Элементы EditText в списке прокрутки теряют свои изменения при прокрутке экрана, поэтому кажется, что нет простого решения для сохранения edittexts при прокрутке вниз

Да, ваше право, вы можете попробовать

EditText теряет содержимое при прокрутке в ListView

Или просто относиться к соответствующим постам справа

Его работа для меня …. Пожалуйста, проверьте это

 listview.setItemsCanFocus(true);