Android: Actualisation de la ListView dans la première activité sur le retour à partir de la deuxième activité
J'ai un problème avec le rafraîchissement de la liste lorsque l'utilisateur ferme une activité et renvoie au précédent. Je vois que le problème est très commun, mais je ne peux pas le résoudre.
J'ai remplacé méthode onResume:
@Override
public void onResume() {
super.onResume();
populateList();
}
populateList() est une méthode où je remplir listView avec la liste des Chaînes:
arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item,list);
listView.setAdapter(arrayAdapter);
Le problème est que lors de la deuxième activité est fermé, de nouveaux éléments sont ajoutés à nouveau dans la liste donc j'ai toute la a doublé. Comme il n'est pas actualisé.
Si j'ai mis notifyDataSetChanged() dans onResume() me jette nullPointerException parce que lorsque l'activité est démarré première fois carte n'est pas initialisé lorsque l'activité est la première fois commencé.
Je ne suis pas sûr de savoir comment gérer cela.
public class testActivity extends Activity {
private int id=1;
private ListView listView;
private CustomArrayAdapter arrayAdapter;
private ArrayList<String> list = new ArrayList<String>();
ArrayList<Item> objectList = new ArrayList<Item>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
@Override
public void onResume() {
super.onResume();
populateList();
}
private void populateList() {
try {
objectList = new GetAsyncTask(id).execute();
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
int size = objectList.size();
String name;
for (int i = 0; i < size; i++) {
name = objectList.get(i).getName();
list.add(name);
}
arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item,
list);
listView.setAdapter(arrayAdapter);
}
}
ListView
déjà contenir des chaînes de caractères. Si oui, n'appelez pas populateList()
.Le problème, c'est avec
list
, comment êtes-vous de peupler ce?Mais j'ai besoin d'appeler populateList (), même si ListView contient des chaînes de caractères. Je vais essayer de l'actualiser. Je ne sais pas si je vous ai compris.
Ah, désolé, j'ai mal compris. Je voudrais effacer l'adaptateur, puis ajouter les chaînes à nouveau.
J'attrape le list_of_files à partir de l'appareil et de le mettre dans une liste populateList(). J'applique ensuite de l'adaptateur. Sur le retour qui liste sur le périphérique est modifiée de sorte à nouveau fait la même chose et le mettre dans une liste. Le problème est dans la ListView il y a encore des éléments anciens et de nouveaux éléments sont ajoutés à la fin. Il est donc double.
OriginalL'auteur Cristiano | 2013-01-09
Vous devez vous connecter pour publier un commentaire.
bien droit au large de la chauve-souris, vous pouvez facilement frapper à cette distance avec une simple instruction conditionnelle qui effectue la commande uniquement si la carte n'est pas
null
:Mais ce me semble, à un niveau plus profond, votre code pourrait être re-compte un peu pour être plus efficace, mais pas nécessairement la plus fonctionnelle.
de faire comme ceci:
vous n'avez pas mis assez de code pour nous permettre de vous aider suffisamment. mais vous devez vérifier que, quel que soit le bloc de code d'initialisation de l'
list
collection n'est pas encore appelée, sans douteonResume
Le fait que vous avez besoin même de ce que j'ai suggéré a moi de peur que les choses ne sont pas tout ce qu'ils pourraient l'être.J'ai mis un code avant de modifications.
Il fonctionne! Juste une correction. Dans ce dernier
else
, ci-dessousarrayAdapter.notifyDataSetChanged();
il doit également l'être:arrayAdapter = new CustomArrayAdapter(this, R.layout.symbol_item, list); listView.setAdapter(arrayAdapter);
Si elle ne l'est pas,ListView
ne contient que des données anciennes.OriginalL'auteur mango
Une approche de base consiste à appeler
list.clear()
avant d'ajouter de nouvelles données. Cela devrait effacer les anciennes données et éviter les doublons. (Mais il est difficile de fournir une réponse exacte sans voir le code en question...)Plus
Vous devez ajouter ce code à votre
onPostExecute()
méthode à l'intérieur d'GetAsyncTask
:Sauf
GetAsyncTask
est imbriquée dans votre Activité, vous aurez besoin de déplacer un peu de variables pourGetAsyncTask
de l'utiliser. Mais cette approche est mieux car il n'a pas la force de l'Activité de attendre résultats (qui peuvent provoquer un "l'Application ne Répond Pas" s'affiche.)J'ai mis à jour ma réponse.
Merci pour les conseils pour AsyncTask! Je vous ai donné une place 🙂
OriginalL'auteur Sam
Vous êtes seulement en montrant la partie de l'application du code, donc j'ai peut-être offbase ici, mais je devine que vous êtes à l'aide d'un Curseur pour revenir à la
list
variable et utiliserlist
pour créer un ArrayAdapter...Si vous voulez que les données soient frais, pourquoi ne pas utiliser un CursorLoader avec le LoaderManager? Il y a plusieurs avantages à la LoaderManager (comme le déplacement de la requête hors de la thread de l'INTERFACE utilisateur), et le LoaderManager fait un peu le levage lourd pour vous quand il s'agit de la surveillance de la DB pour les changements.
Il y a un blog que j'ai trouvé très utile - http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html
C'est tout en supposant que vous êtes en tirant les données à partir d'une base de données...
OriginalL'auteur user1757442
Le problème, c'est que vous êtes à l'appel de la fonction populateList() sans compensation de la liste de la première. De cette façon, il suffit juste de remplir la liste s'ajoute à la précédente contenu.
Ce serait une bonne façon :
Je suis également pas sûr de savoir pourquoi vous avez mis la carte à l'intérieur de la fonction
populateList()
Vous devez l'essayer.
De cette façon en ayant la carte, vous pouvez tout simplement ce dans le onResume() la fonction
OriginalL'auteur Kennedy Nyaga