2013-06-30 15 views
9

Mam listview w mojej aplikacji, która jest w zasadzie poszukiwaniem, więc istnieje kilka EditTexts, które użytkownik musi wypełnić. Napotkałem następujące zagadnienia:Android: EditText w ListView wydanie

  1. Niektóre EditText wymagają wprowadzenia numerycznej, więc ustawić InputType w analogicznym typu XML jako numeryczny, jednak, jak po kliknięciu na EditText klawiatury numerycznej jest pokazany ale prawie natychmiast znika i pojawia się zwykła klawiatura.

  2. Jak można sobie wyobrazić, muszę przechowywać wartości, które użytkownik wprowadza w tych EditTexts. Mam problem z tym, że po wprowadzeniu tekstu w NIEKTÓRYCH EditTexts i przewijaniu w dół, tekst zniknie, gdy wrócę. W moim kodzie widzę, że podjąłem próbę zapobieżenia temu i powinienem wspomnieć, że działa idealnie dobrze z polami wyboru.

  3. Na początku miałem problemy z utratą ostrości, ale rozwiązałem je patrząc na inne pytania (dodano potomkaFocusablity = "beforeDescendants" do ListView i windowSoftInputMode = "adjustPan"). Działa dobrze, z wyjątkiem tego, że gdy EditText jest poniżej połowy ekranu, traci skupienie, gdy tylko zacznę pisać. metoda getView na liście adaptera:

    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

być może to pomóc http://stackoverflow.com/questions/8772714/edittext-loses-content-on-scroll-in-listview?rq=1 – JahShaka

+0

jaki sposób można rozwiązać problem # 3? Jeśli zostanie rozwiązany, proszę napisać odpowiedź: – desidigitalnomad

Odpowiedz

0

ze względu na pytanie 2 można odnosić do tego postu EditText items in a scrolling list lose their changes when scrolled off the screen więc wydaje się, że s nie jest łatwym rozwiązaniem do utrwalania edittexts podczas przewijania w dół

Tak po prawej stronie można spróbować

EditText loses content on scroll in ListView

lub po prostu odnoszą się do Notki na prawo

+1

Dziękuję, ale cała odpowiedź brzmi, jak sam powtarzasz wiersze, ale nie wyjaśnia, jak to zrobić skutecznie, co chcę wiedzieć. Czy mógłbyś wiedzieć, gdzie mogę znaleźć coś takiego? – user2535545

+0

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

+0

Dziękuję, przyjrzę się temu. W każdym razie udało mi się go rozwiązać, okazało się, używając zmiennej lokalnej vh, a tablica posiadaczy była zbyteczna, więc próbowałem usunąć całą tę nadmiar i działało dobrze. – user2535545

18

Solutions wydać # 3:

  1. Ustaw descendantFocusablity="beforeDescendants" w ListView.

  2. Ustaw windowSoftInputMode="adjustPan" w oczywisty

  3. Ustaw listview.setItemsCanFocus(true)

+0

Twoje rozwiązanie jest jedyną, która naprawdę działa! Dzięki! – Valdrinit

+0

Zrobiłeś robotę. Dzięki!!! –

+1

Dzięki. 1. android: descendantFocusability = "afterDescendants". 2. Napisz zapisanie wprowadzonego tekstu, jak tutaj: http://stackoverflow.com/a/19487574/2914140 lub tutaj: http://stackoverflow.com/a/21404201/2914140. – CoolMind

4

Aby rozwinąć na aaRBiyecH „s odpowiedź above, tutaj jest rozwiązaniem i bardziej wyjaśnienia na pytania pogłębione nr 1 i # 3 (source):

Musisz ustawić właściwośćtwojego ListView na "pośladki".

Można to zrobić w XML tak:

android:descendantFocusability="afterDescendants"

lub w kodzie tak:

listview.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

Należy również ustawić elementy być aktywowana.

Możesz to zrobić w następujący sposób: listview.setItemsCanFocus(true);

Musisz również określić, co dzieje się z głównym oknem aktywności, gdy wyświetlana jest klawiatura ekranowa. Odbywa się to poprzez zmianę atrybutu WindowSoftInputMode. Prawdopodobnie chcesz ustawić go na wartość AdjustPan, aby zmiana rozmiaru listy nie została zmieniona, a tym samym GetView nie zostanie ponownie wywołany. Prawdopodobnie dzieje się to teraz, gdy ukrywasz klawiaturę, GetView jest wywoływany ponownie i resetuje oryginalną wartość w EditText.

Można to zrobić, korzystając z atrybutu android:windowSoftInputMode="adjustPan" w pliku XML głównej aktywności lub getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_PAN) programowo.

0

jego pracy dla mnie .... Proszę sprawdzić

listview.setItemsCanFocus(true); 
0

Mam ListView z EditText i kiedy wprowadzać tekst w nim, jeśli przed tym, przewijać ListView, adapter podjąć pewne pozycje , a nie wybrane.

Mój adapter przyjmować różne pozycje zamiast mojego wybór:

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)); 
    }}); 

Jeden Editext wyboru:

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 

Więc dodałem tej metody do onTouchListener tylko dostaje stanowisko selekcji:

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; 
     } 
    }); 

I tylko weź przedmiot, który chcę, jego prace dla mnie.