Mon livre, "Bonjour Android" donne ceci comme un moyen d'utiliser un assistant de base de données personnalisé, de configurer un curseur, puis de configurer un adaptateur comme suit:
Cursor cursor
CustomDatabaseHelper test = new CustomDatabaseHelper(this);
try {
cursor = getData();
showData(cursor);
} finally {
test.close();
}
Cependant, avec cela, chaque fois que je dois actualiser le jeu de données, je dois continuer à exécuter ce bloc de code (ce qui devient un peu difficile dans un onClick () pour un bouton car "ce" n'est pas disponible.
Est-ce le meilleur moyen d'actualiser l'ensemble de données ou dois-je envisager de supprimer le fichier .close et d'émettre un adaptateur.notifyDataSetChanged ()? Si je fais cela, parfois je me rapproche d'une force (et je ne m'en souviens pas pour le moment), mais parfois, elle ne peut pas supprimer correctement. Je pense que c'est peut-être parce que la base de données est actuellement ouverte et tente de s'ouvrir à nouveau.
Devrions-nous également déclarer les variables pour les curseurs, les assistants de base de données et l'adaptateur dans la classe (en dehors de OnCreate) afin qu'elles soient accessibles à toutes les fonctions?
Je réalise que ce n’est que de la mauvaise programmation à ce stade, mais j’essaie d’obtenir des indications sur la meilleure façon de faire les choses.
Vous devriez utiliser adapter.notifyDataSetChanged()
. Que dit le journal lorsque vous l'utilisez?
Ajoutez simplement ce code avant de définir Adapter
cela fonctionne pour moi:
listView.destroyDrawingCache();
listView.setVisibility(ListView.INVISIBLE);
listView.setVisibility(ListView.VISIBLE);
Ou directement, vous pouvez utiliser la méthode ci-dessous après modification de la ressource de données.
adapter.notifyDataSetChanged()
Meilleur moyen d'actualiser Adapter/ListView sur Android
L'appel de notifyDataSetChanged () actualisera les données de la liste, mais setAdapter()
doit être appelé avant de charger les informations correctement:
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
Le code suivant fonctionne parfaitement pour moi
EfficientAdapter adp = (EfficientAdapter) QuickList.getAdapter();
adp.UpdateDataList(EfficientAdapter.MY_DATA);
adp.notifyDataSetChanged();
QuickList.invalidateViews();
QuickList.scrollBy(0, 0);
adapter.notifyDataSetChanged();
Si rien ne fonctionne, créez simplement à nouveau l'instance d'adaptateur avec le nouvel ensemble de résultats ou l'ensemble de résultats mis à jour. Ensuite, vous pouvez voir la nouvelle vue.
XYZAdapter adbXzy = new XYZAdapter(context, 0, listData);
xyzListView.setAdapter(adbXzy);
adbXzy.notifyDataSetChanged();
Si vous utilisez LoaderManager, essayez avec cette instruction:
getLoaderManager().restartLoader(0, null, this);
Il suffit d'écrire dans votre Personnalisé ArrayAdaper
ce code:
private List<Cart_items> customListviewList ;
refreshEvents(carts);
public void refreshEvents(List<Cart_items> events)
{
this.customListviewList.clear();
this.customListviewList.addAll(events);
notifyDataSetChanged();
}
Peut-être que leur problème est le moment où la recherche est faite dans la base de données. Dans son cycle Fragment Override de son Fragment.Java, il suffit de tester les méthodes suivantes:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_x, container, false); //Your query and ListView code probably will be here
Log.i("FragmentX", "Step OnCreateView");// Try with it
return rootView;
}
Essayez de même mettre Log.i
... "onStart" et "onResume".
Enfin, coupez le code dans "onCreate" et insérez-le dans "onStart", par exemple:
@Override
public void onStart(){
super.onStart();
Log.i("FragmentX","Step OnStart");
dbManager = new DBManager(getContext());
Cursor cursor = dbManager.getAllNames();
listView = (ListView)getView().findViewById(R.id.lvNames);
adapter = new CustomCursorAdapter(getContext(),cursor,0);// your adapter
adapter.notifyDataSetChanged();
listView.setAdapter(adapter);
}