2013-06-30 2 views
9

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

  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; 
    } 
    
+0

может быть, это может помочь вам http://stackoverflow.com/questions/8772714/edittext-loses-content-on-scroll-in-listview?rq=1 – JahShaka

+0

как вы решить выпуск # 3? Если вы решите, отправьте ответ – desidigitalnomad

ответ

0

из-за вопрос 2 вы можете относиться к этому сообщению EditText items in a scrolling list lose their changes when scrolled off the screen так кажется Там нет простого решения сохраняются в edittexts при прокрутке

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

EditText loses content on scroll in ListView

или просто касаются соответствующих сообщений на правой

+1

Спасибо, но все ответы на это говорят о том, что вы сами перерабатываете строки, но не объясняет, как это сделать эффективно, что я хочу знать. Не могли бы вы узнать, где я могу найти что-то подобное? – user2535545

+0

http://stackoverflow.com/questions/8772714/edittext-loses-content-on-scroll-in-listview?rq=1 – JahShaka

+0

Спасибо, я посмотрю на это. Во всяком случае, мне удалось это решить, получается, используя локальную переменную vh, и массив держателей был вроде избыточным, поэтому я попытался удалить все это избыточность, и он работал нормально. – user2535545

18

Solutions выпустить # 3:

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

  2. Набор windowSoftInputMode="adjustPan" в проявленном

  3. Набор listview.setItemsCanFocus(true)

+0

Ваше решение - единственное, что действительно работает! Благодаря! – Valdrinit

+0

Ты сделал работу. Благодаря!!! –

+1

Спасибо. 1. android: descendantFocusability = "afterDescendants". 2. Напишите сохранение введенного текста, например, здесь: http://stackoverflow.com/a/19487574/2914140 или здесь: http://stackoverflow.com/a/21404201/2914140. – CoolMind

4

Чтобы расширить ответ aaRBiyecH «s above, вот это решение и более глубокое объяснение на ваши вопросы # 1 и # 3 (source):

Вам необходимо установить свойство 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) программно.

0

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

listview.setItemsCanFocus(true); 
0

У меня есть ListView с EditText и когда я ввод текста в нем, если до этого я прокручивать ListView, адаптер занять несколько позиций , а не выбранный.

Мой адаптер принимать различные позиции, а не мой выбор:

выбор
etCantidad.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 

    @Override 
    public void afterTextChanged(Editable s) { 
     String cantidadTMP = etCantidad.getText().toString(); 
     int cantidad; 
     try { 
       cantidad = Integer.parseInt(cantidadTMP); 
       item.setCantidad(cantidad); 
       Log.i("Name",""+item.getNombre()); 
      }catch (Exception e){ 
        cantidad = 0; 
      } 
     Log.i("QuantityArrayAdapter",String.valueOf(cantidad)); 
    }}); 

Один Editext:

09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1 
09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1 
09-25 09:22:10.458 12719-12719/? I/QuantityArrayAdapter: 1 

Итак, я добавил этот метод к onTouchListener, чтобы только получает позицию выбора:

etCantidad.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      etCantidad.addTextChangedListener(new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        String cantidadTMP = etCantidad.getText().toString(); 
        int cantidad; 
        try { 
         cantidad = Integer.parseInt(cantidadTMP); 
         item.setCantidad(cantidad); 
         Log.i("Name",""+item.getNombre()); 
        }catch (Exception e){ 
         cantidad = 0; 
        } 
        Log.i("QuantityArrayAdapter",String.valueOf(cantidad)); 
       } 
      }); 
      return false; 
     } 
    }); 

И возьмите только тот предмет, который я хочу, его работы для меня.

Смежные вопросы