web-dev-qa-db-fra.com

Meilleur moyen d'actualiser Adapter/ListView sur Android

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.

60
Simon

Vous devriez utiliser adapter.notifyDataSetChanged() . Que dit le journal lorsque vous l'utilisez?

91
Macarse

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()
16
sravan

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();
12
Elenasys

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);
10
Hims
adapter.notifyDataSetChanged();
1
Dinesh Saini

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();
1
Vijay Kumar Kanta

Si vous utilisez LoaderManager, essayez avec cette instruction:

getLoaderManager().restartLoader(0, null, this);
0
adev

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();
}
0
SAHOOD SSA

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);
}
0
André da Silva