2010-11-03 7 views
15

J'ai un ListView qui me montre des données à travers un tableau (qui est dans une autre classe et j'y accède à travers son objet).Android Liste affichage actualiser

Chaque fois que je supprime un élément du menu contextuel ListView via le menu contextuel, la liste n'est pas actualisée mais l'élément est supprimé du tableau. Comment puis-je actualiser la liste pour le montrer?

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

Répondre

38

Vous devez informer votre carte ListView que les données ont changé.

listViewAdapater.notifyDataSetChanged(); 

Si pour une raison ne fonctionne pas et il y a des situations où il wierd semble que ce n'avisait pas, vous pouvez simplement réattribuer votre adaptateur via le constructeur avec le tableau mis à jour.

+0

où j'ai besoin de mettre cette ligne? –

+1

juste après stockname.remove (post-1); ListViewAdapter est juste un exemple, vous devez le remplacer par ce que votre adaptateur est appelé. Si vous ne pouvez pas y accéder, faites-en une variable globale pour cette classe. – blindstuff

+4

Essayez de réinitialiser l'adaptateur, comme vous l'avez fait lorsque vous l'avez créé. – blindstuff

4

Je n'ai pas de méthode notifyDataSetChanged() (Android 2.3).

Ce qui suit a fonctionné pour moi:

getListView().invalidate(); 

Dans mon cas, j'ai changé l'adaptateur tout et il n'a toujours pas rafraichir, donc pour moi la méthode décrite ci-dessus est la seule solution de travail.

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

Vous devez invalider() votre liste. dans mon cas, j'invalide() la liste, initialise la liste avec des éléments null, puis réinitialise ma liste –

0

Liste rafraîchissante pour moi: listView.invalidateViews();

Il va le faire:

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

Le cas de gérer une suppression de l'élément de liste ou de retrait tout élément immediatement.

Testé dans API 24.