2013-02-13 9 views
5

Momentan benutze ich setAdapter, um meine ListView zu aktualisieren, aber ich denke, der richtige Weg ist, notifiyDatasetChanged() zu verwenden, und ich kann das nicht in meiner Hauptklasse (es ist in dem Adapter) arbeiten. Hier ist der Fehler:Wie bekomme ich notifyDatasetChanged() um mit einem ListAdapter zu arbeiten?

Verfahren notifyDatasetChanged() ist nicht definiert für den Typ ListAdapter

Ich vermute, bin es gibt einen besseren Weg, dies zu tun - kann jemand zeigen Sie mir in die richtige Richtung?

Hier ist die relevanten Teile meines Codes:

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 
    } 
} 

Hier ist der Adapter:

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

Es ist 'notifyDataSetChanged()' - beachten Sie das Großbuchstabe S. Sie haben ein Kleinbuchstabe 's' in der Zeile, die Sie zeigen, hat einen Fehler. – Squonk

+0

Zunächst müssen Sie die Verwendung von notifyDatasetChanged kennen ... Benachrichtigt die angehängten Beobachter, dass die zugrunde liegenden Daten geändert wurden, und jede View, die den Datensatz widerspiegelt, sollte sich selbst aktualisieren. Verstehen Sie dies vor dem Implementieren ... notifyDatasetChanged() wird verwendet, wenn die Daten in Ihren Adapterdaten aktualisiert oder einfach geändert werden. Dies bedeutet, dass die mit dem Adapter verknüpfte Auflistung geändert wird. Keine Notwendigkeit, es in der Schöpfung zu nennen – Pragnani

+0

Danke, habe ich viel Code ausgeschnitten, so dass ich es nicht auf Schaffung anrief, sah es gerade so hier aus. – GrilledCheese

Antwort

3

Erstellen Sie eine Instanz der benutzerdefinierten Adapter, so können Sie es überall benutzen Sie mögen ...

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(); 
} 
} 

By the way, wenn Ihr listScore Array bereits geladen ist, dann brauchen Sie nicht

verwenden
adapter.notifyDatasetChanged(); 
adapter.notifyDatasetChanged(); 
+0

Danke, das war eine sehr einfache Erklärung und es funktioniert perfekt (außer ich musste in NotifyDataSetChanged() setzen; wie jemand anders angemerkt) – GrilledCheese

+0

Ahh ja, ich habe es einfach übersehen :) Aber wie gesagt, es ist nicht notwendig Verwenden Sie es in Ihrer Situation, wenn Ihre Liste bereits geladen ist. – yahya

1

Dont die notifyDataSetChanged nennen(); Methode während der Erstellung.

es nur nennen, wenn Inhalte Ihrer listViewScore Änderungen .. und es zu

zu dieser zeit verwenden

ersetzen

listView.getAdapter().notifyDatasetChanged(); 

mit

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

und die Magie sehen ...

danke.