2013-02-13 13 views
5

In questo momento utilizzo setAdapter per aggiornare il mio ListView, ma penso che il modo corretto sia usare notifiyDatasetChanged() e non riesco a farlo funzionare nella mia classe principale (è nell'adattatore). Ecco l'errore:Come posso notificare notifyDatasetChanged() per funzionare con ListAdapter?

Il metodo notifyDatasetChanged() è definito per il tipo di ListAdapter

Sto indovinando c'è un modo migliore di fare questo - qualcuno mi può puntare nella giusta direzione?

Ecco le parti pertinenti del mio codice:

public class ScoreList extends SherlockFragmentActivity { 

    private ListView listViewScore; 

    static List<Score> listScore = new ArrayList<Score>(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.score_list); 
     ctx = this; 
     listScore = dbh.getAllScores(); 

     listViewScore = (ListView) findViewById(R.id.score_list); 

     listViewScore.setAdapter(new ScoreListAdapter(ctx, 
       R.layout.score_row_item, listScore)); 
     listViewScore.getAdapter().notifyDatasetChanged(); //this is where I get the error 
    } 
} 

Qui sta l'adattatore:

public class ScoreListAdapter extends ArrayAdapter<Score> { 
    private int resource; 
    private LayoutInflater inflater; 

    public ScoreListAdapter(Context ctx, int resourceId, List<Score> objects) { 
     super(ctx, resourceId, objects); 
     resource = resourceId; 
     inflater = LayoutInflater.from(ctx); 
     //context = ctx; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     convertView = (LinearLayout) inflater.inflate(resource, null); 

     Score score = getItem(position); 

     TextView txtName = (TextView) convertView.findViewById(R.id.name); 
     txtName.setText(score.getName()); 

     TextView txtScoreChange = (TextView) convertView 
       .findViewById(R.id.scoreChange); 
     int scoreChange = Integer.parseInt(score.getScoreChange()); 
     if (scoreChange > 0) 
      txtScoreChange.setText("+" + scoreChange); 
     else if (scoreChange < 0) 
      txtScoreChange.setText("" + scoreChange); 
     else 
      txtScoreChange.setText(""); 

     TextView txtScoreTotal = (TextView) convertView 
       .findViewById(R.id.scoreTotal); 
     txtScoreTotal.setText(score.getScoreTotal()); 

     final LinearLayout currentRow = (LinearLayout) convertView 
       .findViewById(R.id.scoreRowLayout);     

     notifyDataSetChanged(); 
     return convertView; 
    } 
} 
+0

E ''notifyDataSetChanged()' - si noti la S maiuscola. Si ha una lettera minuscola' s 'sulla riga che si visualizza ha un errore. – Squonk

+0

Prima di tutto è necessario conoscere l'uso di notifyDatasetChanged ... Notifica agli osservatori collegati che i dati sottostanti sono stati modificati e che qualsiasi Vista che riflette il set di dati dovrebbe aggiornarsi. Comprendere questo prima di implementare ... notifyDatasetChanged() verrà utilizzato quando i dati contenuti nei dati dell'adattatore vengono aggiornati o semplicemente modificati..quando viene modificata la raccolta associata all'adapter. Non c'è bisogno di chiamarlo nella creazione – Pragnani

+0

Grazie, ho ritagliato un sacco di codice quindi non lo stavo chiamando alla creazione, sembrava proprio così. – GrilledCheese

risposta

3

Creare un'istanza della scheda personalizzata, in modo da poter utilizzare ovunque ti piace ...

public class ScoreList extends SherlockFragmentActivity { 

private ListView listViewScore; 

private ScoreListAdapter adapter; 

static List<Score> listScore = new ArrayList<Score>(); 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.score_list); 
    ctx = this; 
    listScore = dbh.getAllScores(); 

    listViewScore = (ListView) findViewById(R.id.score_list); 

    adapter = new ScoreListAdapter(ctx, R.layout.score_row_item, listScore); 
    listViewScore.setAdapter(adapter); 
    adapter.notifyDatasetChanged(); 
} 
} 

Tra l'altro, se l'array listScore è già caricato, allora non c'è bisogno di usare

adapter.notifyDatasetChanged(); 
+0

Grazie, questa è stata una spiegazione molto semplice e funziona perfettamente (eccetto che ho dovuto usare maiuscola Set in notifyDataSetChanged(); come notato da qualcun altro) – GrilledCheese

+0

Ahh sì, l'ho appena trascurato :) Ma come ho detto, non è necessario usalo nella tua situazione se la tua lista è già stata caricata. – yahya

1

Non chiamare il notifyDataSetChanged(); metodo durante la creazione.

chiamano solo quando il contenuto delle modifiche listViewScore .. e di usarlo a quel tempo-

sostituire

listView.getAdapter().notifyDatasetChanged(); 

con

((ScoreListAdapter)listView.getAdapter()).notifyDataSetChanged(); 

e vedere la magia ...

grazie.

Problemi correlati