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
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.
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);
}
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) –
Set
android:windowSoftInputMode="adjustPan"
per la vostra attività nel AndroidManifest.xml
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) –
ti ha lavorato per me ma non ho idea del perché o qual era il problema:/ –
@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. –
Per gli utenti futuri, tutto qui è troppo complicata. La risposta corretta è aggiungere
android:descendantFocusability="afterDescendants"
alla vostra listaview.
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;
}
}
}
- 1. Android: EditText perde contenuto sullo scorrimento in ListView?
- 2. in listview espandibile android
- 3. Android EditText in ListView - tastiera
- 4. android - index per ListView?
- 5. Inverso ListView in Android?
- 6. ListView in SlidingDrawer perde lo stato attivo dopo onResume
- 7. Android ListView Abbassa per aggiornare
- 8. Android - Rimuovi CacheColorHint per ListView
- 9. Android: EditText in ListView
- 10. Scorri una ListView per pixel in Android
- 11. Altezza dinamica per riga ListView in Android
- 12. mantiene l'effetto a catena durante notifydatachanged in recyclerview
- 13. Il contesto Android perde in AsyncTask
- 14. android uiautomator per fare clic su ListView
- 15. NullPointerException sulla chiamata ResultSet.getDate()
- 16. stile item listview android?
- 17. Seekbar impeccabile in listview android
- 18. Rimuovi elementi ListView in Android
- 19. iterazione elementi ListView in Android
- 20. Android, SlidingPaneLayout e listView
- 21. Android: creare ListView in XML?
- 22. annidata listview espandibile in Android
- 23. Android - click ritardati in ListView
- 24. Come caricare "agevolmente" la Listview in Android
- 25. Ricevitore broadcast per chiamata persa in Android
- 26. Ottimizza prestazioni listview Android Android
- 27. Android ListView Header Disable Click
- 28. Personalizzazione dei colori di ListView per Android?
- 29. Binding onScrolling listener per Android ListView
- 30. voce di elenco personalizzato per ListView Android
soluzione elegante ed efficace. Grazie! :) –
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? –
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