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;
}
}
Écrivez simplement
listView.setAdapter(null);
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
C’est simple. Commencez par vider votre collection et ensuite effacer une liste comme celle-ci:
yourCollection.clear();
setListAdapter(null);
À 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();
}
};;
Simple ça marche moi :)
YourArrayList_Object.clear();
Il suffit de mettre le code ListView.Items.Clear();
sur votre méthode
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);
--------------------------------------------------
**
}
Retirez vos éléments de votre adaptateur personnalisé et appelez notifyDataSetChanged()
.