web-dev-qa-db-fra.com

Effacer le contenu de la listview?

J'ai un petit problème avec ListView. Comment effacer un contenu ListView tout en sachant qu'il dispose d'un adaptateur personnalisé?

edit - la classe d'adaptateur personnalisé étend BaseAdapter, elle ressemble à ceci:

import Android.app.Activity;
import Android.content.Context;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseAdapter;
import Android.widget.TextView;

public class MyAdapter extends BaseAdapter {

    private Activity activity;
    private String[] data;
    private static LayoutInflater inflater = null;

    public MyAdapter(Activity a, String[] str) {
        activity = a;
        data = str;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public static class ViewHolder {
        public TextView text;
    }

    @Override
    public int getCount() {
        return data.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        View v = view;
        ViewHolder holder;
        if (v == null) {
            v = inflater.inflate(R.layout.rowa, null);
            holder = new ViewHolder();
            holder.text= v.findViewById(R.id.dexter);
            v.setTag(holder);
        } else {
            holder = v.getTag();
        }

        holder.text.setText(data[position]);

        return v;
    }

}
71
Mohamed Gallah

Écrivez simplement

listView.setAdapter(null);
186
mikepenz

Je suppose que vous avez passé une liste ou un tableau à l'adaptateur. Si vous conservez l’instance de cette collection ajoutée, vous pouvez effectuer un 

collection.clear();
listview.getAdapter().notifyDataSetChanged();

cela ne fonctionnera que si vous avez instancié l'adaptateur avec collection et que c'est la même instance.

En outre, selon l'adaptateur que vous avez étendu, vous ne pourrez peut-être pas le faire. SimpleAdapter est utilisé pour les données statiques. Par conséquent, il ne peut pas être mis à jour après la création.

PS. tous les adaptateurs n’ont pas de méthode clear (). ArrayAdapter le fait, mais ListAdapter ou SimpleAdapter non

51
Maragues

C’est simple. Commencez par vider votre collection et ensuite effacer une liste comme celle-ci:

 yourCollection.clear();
 setListAdapter(null);
7
zheek

À partir des versions Android M et N, suivre fonctionne pour moi et serait la bonne approche. Vider la liste ou attribuer la valeur null à l'adaptateur n'est pas la bonne approche et conduirait à un problème de pointeur nul, à une liste non valide et/ou à un crash de l'application.

Faites simplement:

    mList.clear();
    mAdapter.notifyDataSetChanged();

c’est-à-dire d’abord que vous effacez complètement la liste, puis que vous informez l’adaptateur de ce changement. Android se chargera de mettre à jour correctement l'interface utilisateur avec une liste vide. Dans mon cas, ma liste est un ArrayList.

Si vous effectuez cette opération à partir d'un autre thread, exécutez ce code sur le thread d'interface utilisateur:

    runOnUiThread(mRunnable);

Où mRunnable serait:

    Runnable mRunnable = new Runnable() {
        public void run() {
            mList.clear();
            mAdapter.notifyDataSetChanged();
        }
    };;
3
zeeshan

Simple ça marche moi :)

YourArrayList_Object.clear();
1
Agilanbu

Il suffit de mettre le code ListView.Items.Clear(); sur votre méthode

0
Charles

Il existe une solution pour l'entrée en double dans listview . Vous devez déclarer la méthode onBackPress()- sur votre activité et noter le code de surbrillance donné ci-dessous: 

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    **

    attendence_webdata.clear(); list.setAdapter(null);
    --------------------------------------------------

    **
 }
0
Arpit Patel

Retirez vos éléments de votre adaptateur personnalisé et appelez notifyDataSetChanged() .

0
mreichelt