Desidero aggiornare una singola riga nella mia listview con contenuti diversi dopo aver premuto un pulsante. So che posso usare notifydatasetchanged(
) ma questo aggiornerebbe l'intero listView
.ListView Aggiornamento di una singola riga
Ho letto questo answer e si adatta perfettamente per quello che voglio fare.
Ho fatto un listview con 5 righe e quando premo il pulsante voglio aggiornare la 4a riga con un testo diverso. Non voglio impostare il testo in modo programmatico poiché questo è solo un progetto fittizio solo per vedere se è possibile aggiornare una singola riga e il mio vero progetto è molto più complesso di un semplice textview
.
Quindi la mia domanda è: posso usare getView()
per aggiornare una singola riga in un listview
?
Ecco il mio codice:
mia attività:
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);
}
});
}
}
mio adattatore:
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;
}
}
Questo è ciò che l'attività si presenta come:
Ma quando si preme il pulsante del mio nulla cambia
Ottima risposta. Sono d'accordo con te. Un'altra cosa che potrebbe fare è semplicemente impostare su ItemClickListener su ListView stesso, e se la posizione è qualsiasi (supponendo che non si usi un pulsante), si aggiorna semplicemente l'elenco nell'adattatore. Ovviamente alla fine ha bisogno di capire quale opzione è meglio per lui. – Andy
@Andy: hai ragione. In realtà sarebbe un'idea migliore. Ma dal momento che, in particolare, ha chiesto di modificare il contenuto della riga al clic di un pulsante, ci sono andato. – Ashwin
:) Oh no, tecnicamente hai ragione @Ashwin solo perché è più efficiente. Non c'è lavoro inutile. Dal momento che vuole solo aggiornare una singola riga. Ma lui menziona che questo è solo un test, quindi immagino che dovrebbe anche avere un altro metodo nel caso in cui vuole essere aggiornato di più. – Andy