2012-03-02 7 views
17

Ho qualche edittext all'interno di un listview. Ho un focuslistener generico sul edittext che aggiorna il valore del modello di dati e anche lo sfondo di edittext quando l'attenzione è persa chiamando notifydatachanged. Il problema è che se uno degli editor è in primo piano, quando toccherò il prossimo editoxt, esso si focalizzerà momentaneamente per poi perdere l'attenzione. Sospetto che sia dovuto alla chiamata al metodo notifydatha che sta facendo ridisegnare tutte le viste, dopo di che l'attenzione è stata persa. Qualcuno ha un suggerimento o aggirare il problema? Grazie.L'editor per Android in listview perde l'attenzione sulla chiamata notifydatachanged

risposta

17

Sta davvero succedendo perché tutte le viste sono ridisegnate, quindi il testo di modifica che rappresenta qualsiasi riga utilizzata per essere focalizzato ora è un oggetto completamente diverso. Imposta una variabile nel tuo adattatore: int currentFocusedRow;

in getView per l'adattatore: aggiungi un listener onFocusChanged a ogni testo di modifica e quando il testo di modifica ottiene il focus, imposta currentFocusedRow = qualsiasi riga in cui si trova il testo di modifica focalizzato. Imposta anche qualsiasi testo di modifica che si trova nella correnteFocusedRow essere concentrato.

+0

soluzione elegante ed efficace. Grazie! :) –

+0

Ciao a tutti e @Monkeyless, avendo adottato la soluzione di cui sopra, ho riscontrato un altro problema. La mia vista elenco contiene anche alcuni spinners, ma ho notato che se lo spinner viene toccato dopo che un edittext è stato messo a fuoco in precedenza, lo spinner non imposta la selezione anche se viene visualizzata la finestra di selezione. Come sospetto sia dovuto alla messa a fuoco ancora impostata sull'ultimo edittesto, ho provato a cancellare la variabile al momento attuale dopo che qualsiasi editaxt ha richiesto la messa a fuoco. Questo però non ha risolto il problema. Qualche idea su questo? –

+2

Ho lo stesso problema e capisco la soluzione ma non riesco a farlo funzionare - newbie relativo ad Android anche se quindi qualsiasi puntatore/codice sarebbe di grande aiuto. Qualche possibilità di attaccare un po 'di codice - specialmente il listener onFocusedChanged. Grazie in anticipo. – Kern

6

Ho anche riscontrato un problema con EditText che ha perso lo stato attivo, ma è stato risolto il problema con 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); 
} 
+5

Questo funziona solo per un EditText nell'elenco, ma se ogni elemento di elenco ha tale elemento EditText e sto facendo clic su EditText nella seconda riga, lo stato attivo, dopo che è stato visualizzato il softkeyboard, sarà in EditText del * prima * lista riga, ma dovrebbe essere nel * secondo *. (Android 4.1) –

18

Set

android:windowSoftInputMode="adjustPan" 

per la vostra attività nel AndroidManifest.xml

+9

Questo funziona per quanto riguarda lo stato attivo, ma se l'elenco è più lungo dello schermo e inizi a digitare, il campo EditText si sposterà fuori dall'area visibile dell'utente, quindi non vedrà cosa sta effettivamente digitando una volta inizia a entrare nel primo personaggio. (Android 4.1) –

+2

ti ha lavorato per me ma non ho idea del perché o qual era il problema:/ –

+0

@PadmaKumar Ho editText nell'intestazione del recyclerview. Quando chiamo notifydatastatechanged, ha perso l'attenzione da quel testo di modifica. Quindi ho bisogno di fare nuovamente clic su quel testo di modifica per concentrarsi su quello e sul tipo. Per favore fatemi sapere la soluzione per questo. –

0

Per gli utenti futuri, tutto qui è troppo complicata. La risposta corretta è aggiungere

android:descendantFocusability="afterDescendants" 

alla vostra listaview.

0

Esempio di applicazione suggerimento di Sam Judd con un ulteriore interruttore 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; 
     } 

    } 



}