Je souhaite mettre à jour une seule ligne dans ma liste avec du contenu différent une fois que j'appuie sur un bouton. Je sais que je peux utiliser notifydatasetchanged(
) mais cela mettrait à jour l'ensemble listView
.ListView Mise à jour d'une seule ligne
J'ai lu ce answer et il correspond parfaitement à ce que je veux faire.
J'ai fait un listview avec 5 lignes et quand j'appuie sur le bouton je veux mettre à jour la 4ème ligne avec un texte différent. Je ne veux pas mettre le texte par programme car c'est juste un projet factice juste pour voir si rafraîchir une seule ligne est possible et mon vrai projet est beaucoup plus complexe qu'un simple textview
.
Donc ma question est: puis-je utiliser getView()
pour mettre à jour une seule ligne dans un listview
?
Voici mon code:
mon activité:
public class MainActivity extends Activity {
public ListView list1;
public listAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list1 = (ListView) findViewById(R.id.my_list);
adapter = new listAdapter(this);
list1.setAdapter(adapter);
Button button1 = (Button) findViewById(R.id.my_button);
button1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
adapter.setText("Different text");
View row2Update = list1.getChildAt(3);
list1.getAdapter().getView(3, row2Update, list1);
}
});
}
}
Mon adaptateur:
public class listAdapter extends BaseAdapter{
public Activity activity;
public String text="Normal Text";
public listAdapter(Activity activity){
this.activity = activity;
}
public void setText(String text){
this.text = text;
}
public int getCount() {
return 5;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = activity.getLayoutInflater();
LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null);
TextView textView = (TextView) rowView.findViewById(R.id.row_text);
textView.setText(text);
return rowView;
}
}
C'est ce que l'activité ressemble à:
Mais quand je presse mon bouton rien ne change
Bonne réponse. Je suis d'accord avec toi. Une autre chose qu'il pourrait faire est juste de définir onItClickListener à la ListView lui-même, et si la position est quelque chose (en supposant que vous n'utilisez pas un bouton), vous venez de mettre à jour la liste dans l'adaptateur. Bien sûr, il doit finalement trouver l'option qui lui convient le mieux. – Andy
@Andy: Vous avez raison. En fait ce serait une meilleure idée. Mais depuis, il a demandé spécifiquement de changer le contenu de la ligne sur le clic d'un bouton, je suis allé pour cela. – Ashwin
:) Oh non, techniquement, vous avez raison @Ashwin simplement parce que c'est plus efficace. Il n'y a pas de travail inutile à faire. Comme il veut seulement mettre à jour une seule ligne. Mais il mentionne que c'est seulement un test, donc je me dis qu'il devrait aussi avoir une autre méthode au cas où il voudrait plus d'être mis à jour. – Andy