8 Stimmen

[done]notifyDataSetChanged() aktualisiert ListActivity nicht automatisch

Ich habe einige Probleme mit notifyDataSetChanged() von einem BaseAdapter. Diese Methode wird in refreshItems() aufgerufen und soll den BaseAdapter meiner ListActivity aktualisieren. Beim Aufruf von notifyDataSetChanged() passiert nichts, bis ich die ListView z.B. mit den Pfeiltasten nach unten scrolle. Irgendwie wird auch die geänderte getView() Methode nicht aufgerufen. Vielleicht können Sie mir einen Tipp geben - danke! :)

public class WinampControlClientPlaylist extends ListActivity {

static WinampControlClientPlaylist activity = null;

static EfficientAdapter adapter = null;

static class EfficientAdapter extends BaseAdapter {

    public EfficientAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    private LayoutInflater mInflater;

    @Override
    public int getCount() {
        return Settings.playlistlength;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        if (convertView == null) 
        {
            holder = new ViewHolder();

            convertView = mInflater.inflate(R.layout.listview, null);

            holder.text = (TextView) convertView.findViewById(R.string.playlist_title);
            holder.image = (ImageView) convertView.findViewById(R.string.playlist_play);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.text.setText(Settings.playlist[position]);

        if (position == Settings.playlistPosition)
        {
            holder.text.setTypeface(null, Typeface.ITALIC);
            holder.image.setVisibility(0);
        }
        else
        {
            holder.text.setTypeface(null, Typeface.NORMAL);
            holder.image.setVisibility(4);
        }

        return convertView;
    }

    static class ViewHolder {
        TextView text;
        ImageView image;
    }

    @Override
    public Object getItem(int position) {
        return Settings.playlist[position];
    }
}

void initialize()
{
    adapter = new EfficientAdapter(this);
    setListAdapter(adapter);

    //registerForContextMenu(getListView());
}

@Override
public void onResume()
{
    super.onResume();

    // REFRESH PLAYLIST
    if (getListAdapter() == null && Settings.playlist != null)
        initialize();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playlist);

    activity = this;
}

static void refreshItems()
{
    try {
        adapter.notifyDataSetChanged();
    } catch (Exception e) {}

}

}

0 Stimmen

Nun, vielleicht verstehe ich Ihre Frage nicht, aber eine ListView wird aktualisiert, wenn ihr Datensatz geändert hat, und die Art und Weise zu benachrichtigen, dass ist der Aufruf notifyDataSetChanged() an die ListView. Aber hier sehe ich nicht, wo Sie den Datensatz ändern, Einstellungen ändern sich in anderen Thread oder Ort?

0 Stimmen

Ja, richtig, eine andere Activity ruft Settings.playlistPosition = newNumber und WinampControlClientPlaylist.refreshItems(); Aber wenn das passiert, wird die ListView nicht aktualisiert. Ich sehe nur Änderungen, wenn ich danach im Emulator Pfeil nach oben/unten drücke.

0voto

raj Punkte 642

Aufrufen AbsListView.invalidateViews() in Ihrer Listenansicht nach BaseAdapter.notifyDataSetChanged()

0voto

Ma Chao Punkte 1

Ich bin auf das gleiche Problem gestoßen und habe versucht, die notifyDataSetChanged() auf dem Adapter. Außerdem habe ich auch versucht, die refreshDrawableState() , invalidateViews() auf die Ansicht und keine davon hat funktioniert. Alle diese Methoden werden im UI-Thread aufgerufen. Dann fand ich dies Wie kann man die Ansichten löschen, die im RecycleBin der ListView gespeichert sind? . Schließlich setAdapter() funktioniert, nur wenn ich einen neuen Adapter erstelle.

0voto

Maddy Punkte 4672

Der Hauptgrund dafür ist die falsche Referenz des Adapters, auf dem Sie notifyDataSetChanged() aufrufen;

Ich denke, Sie müssen sicherstellen, dass Sie das Adapterobjekt einmal erstellen und notifyDataSetChanged() auf demselben Objekt aufrufen.

Sie können den Objektreferenzwert zum Zeitpunkt der Erstellung des Adapterobjekts und beim Aufruf der Methode notifyDataSetChanged() debuggen.

0voto

Kang Sotheara Punkte 1
Why it works in first code ?

--- Weil Sie die Werte in eine temporäre Liste setzen und diese dem Adapter übergeben, der sie dann in der Listenansicht anzeigt.

Why not work in second code ?

--- Weil Sie temp auf adapter setzen, lange bevor Sie den Wert in temp eingeben Zweitens kann es sein, dass Ihre Adapterklasse nicht den aktualisierten Wert erhält, wenn Sie einen neuen Wert in temp setzen. Das liegt daran, dass temp nicht öffentlich oder nicht auf Klassenebene oder nicht statisch ist. Setzen Sie die temp Deklaration auf Root Ebene und versuchen Sie es.

Und bitte zeigen Sie Ihren vollständigen Code so viel wie nötig und Logcat, wenn Sie alle Warnungen als auch erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X