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.

9voto

ashakirov Punkte 11503

Ich hatte das gleiche Problem (ListView aktualisiert nur, wenn ich es scrollen, auch notifyDataSetChanged half nicht). Ich löse es auf diese Weise: versuchen Sie einfach, Ihre "Ansichtsänderungen" in Thread zu tun, die Ihre Benutzeroberfläche erstellt, dh.

activity.runOnUiThread(new Runnable() {         
        public void run() {
              //do your modifications here

              // for example    
              adapter.add(new Object());
              adapter.notifyDataSetChanged()  
        }
});

4voto

Cheryl Simon Punkte 45901

Wie Franco betonte, notifyDataSetChanged() wird verwendet, um dem ListView dass sich der Inhalt des Adapters geändert hat, nicht, dass er sich neu zeichnen muss. Sie ändern lediglich eine Einstellung, die sich darauf auswirkt, wie etwas gerendert wird. Versuchen Sie den Aufruf von refreshDrawableState um der Liste mitzuteilen, dass sie neu gezeichnet werden soll.

4voto

whlk Punkte 15257

Versuchen Sie anzurufen invalidate() auf Ihrer ListView.

0voto

cV2 Punkte 5646

Ich glaube, es gibt einige Probleme mit dem Adapter; vielleicht ist er nicht richtig eingestellt.

Nach meiner Erfahrung gab es immer irgendeinen Grund, der die Aktualisierung der Listenansicht (und des Adapters) verhinderte.

0voto

Roy Solberg Punkte 16263

Ich hatte das gleiche Problem, und die Lösung für mich war ein Anruf requestLayout() auf der ListView.

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