2010-11-03 13 views
15

Ich habe eine ListView, die mir einige Daten durch ein Array zeigt (das ist in einer anderen Klasse und ich bin darauf zugreifen durch sein Objekt).Android Listenansicht aktualisieren

Immer wenn ich ein Element aus dem ListView über das Kontextmenü lösche, wird die Liste nicht aktualisiert, aber das Element wird aus dem Array gelöscht. Wie kann ich die Liste aktualisieren, um dies anzuzeigen?

Code:

 public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    if (v.getId()==R.id.mainListView) { 
     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; 
     post=info.position; 
     menu.setHeaderTitle(stocks[info.position]); 
     String[] menuItems = stt; 
     for (int i = 0; i<menuItems.length; i++) { 
      menu.add(Menu.NONE, i, i, menuItems[i]); 
      } 
    } 
    } 

    @Override 
     public boolean onContextItemSelected(MenuItem item) { 
     AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
     int menuItemIndex = item.getItemId(); 
     String[] menuItems = stt; 
     String menuItemName = menuItems[menuItemIndex]; 
     listItemName = stocks[info.position]; 
     stockname.remove(post-1); 

    return true; 
    } 

Antwort

38

Sie haben Ihre Listview-Adapter zu benachrichtigen, dass die Daten geändert hat.

listViewAdapater.notifyDataSetChanged(); 

Wenn das aus irgendeinem Grund nicht funktioniert, und es gibt einige seltsame Situationen, in denen es, wie es scheint, war nicht benachrichtigt, können Sie einfach den Adapter über den Konstruktor mit dem aktualisierten Array zuweisen.

+0

wo muss ich diese Zeile setzen? –

+1

direkt nach stockname.remove (post-1); listViewAdapter ist nur ein Beispiel, Sie müssen das mit dem, was immer Ihr Adapter genannt wird, ersetzen. Wenn Sie nicht darauf zugreifen können, machen Sie es einfach zu einer globalen Variable für diese Klasse. – blindstuff

+4

Versuchen Sie, den Adapter erneut zu initialisieren, wie Sie es bei der Erstellung getan haben. – blindstuff

4

Ich habe keine notifyDataSetChanged() Methode (Android 2.3).

Die folgenden für mich gearbeitet:

getListView().invalidate(); 

In meinem Fall habe ich den ganzen Adapter geändert haben und es hat aufzufrischen noch nicht, für mich so das oben beschriebene Verfahren ist die einzige funktionierende Lösung.

0
private static ArrayList<Radio> m_streamsList; 

    final ListView listView = (ListView) rootView.findViewById(R.id.stream_listRS); 

    //my class where i insert data into my array 
    m_myDBHelp = new DBHelper(); 
    m_streamsList = m_myDBHelp.selectStreamsList(); 

    // my list adapter - this is a class created by me 
    RadioAdapter adapt = new RadioAdapter(context, m_streamsList); 
    listView.setAdapter(adapt); 

    ////////////------------- so . when i inserted a row in db, i need to refresh the list 
    m_myDBHelp.insertStreamIntoDB(String name, String url); 
    /// in my case method invalidate works fine 
    listView.invalidate(); 
    m_streamsList = null; 
    m_streamsList = m_myDBHelp.selectStreamsList(); 

    //you need to set adapter again 
    RadioAdapter adapt2 = new RadioAdapter(context, m_streamsList); 
    listView.setAdapter(adapt2); 






import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import com.example.npopa.musicplayern.R; 
import com.example.npopa.musicplayern.Radio; 

import java.util.ArrayList; 

public class RadioAdapter extends BaseAdapter{ 
private ArrayList<Radio> m_streams; 
private LayoutInflater m_stramInf; 

public RadioAdapter(Context c, ArrayList<Radio> theStreams){ 
    m_streams = theStreams; 
    m_stramInf = LayoutInflater.from(c); 
} 

@Override 
public int getCount() { 
    return m_streams.size(); 
} 

@Override 
public Object getItem(int arg0) { 
    return null; 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //map to radio_s layout 
    LinearLayout streamLay = (LinearLayout) m_stramInf.inflate(R.layout.all_songs_t, parent, false); 

    TextView name = (TextView) streamLay.findViewById(R.id.song_title); 
    TextView url = (TextView) streamLay.findViewById(R.id.song_artist); 
    ImageView imgALb = (ImageView) streamLay.findViewById(R.id.albumicon); 

    //get all_songs_t using position 
    Radio currStream = m_streams.get(position); 
    name.setText(currStream.getName()); 
    url.setText(currStream.getUrl()); 
    imgALb.setImageResource(R.drawable.radio_stream); 

    //set position as tag 
    streamLay.setTag(position); 
    return streamLay; 
} 

}

public class Radio { 
private int id; 
private String name; 
private String url; 

public Radio(int id, String name, String url) { 
    this.id = id; 
    this.name = name; 
    this.url = url; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 
} 
+0

Sie müssen Ihre Liste ungültig machen(). In meinem Fall mache ich die Liste ungültig(), initialisiere die Liste mit Null-Elementen und reinitialisiere dann meine Liste neu –

0

Liste für mich erfrischend: listView.invalidateViews();

Es wird tun:

mDataChanged = true; 
rememberSyncState(); 
requestLayout(); 
invalidate(); 

der Fall, da einige Listenelement Entfernung oder Entfernung zu verwalten alle Element auf einmal.

Getestet in API 24.

Verwandte Themen