web-dev-qa-db-fra.com

Actualisation de la liste Android

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). 

Chaque fois que je supprime un élément du 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 l'afficher?

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

Vous devez informer votre adaptateur ListView que les données ont été modifiées.

listViewAdapater.notifyDataSetChanged();

Si, pour une raison quelconque, cela ne fonctionne pas et qu'il existe des situations étranges dans lesquelles il semble qu'il ne s'agisse pas d'une notification, vous pouvez simplement réaffecter votre adaptateur via le constructeur avec le tableau mis à jour.

40
blindstuff

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é tout l'adaptateur et il n'a toujours pas été actualisé. La méthode décrite ci-dessus est donc la seule solution qui fonctionne.

4
user529543

Essayez getListView () . refreshDrawableState

0
Edwin Evans

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

Ça va faire:

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

Le cas de gérer certains enlèvements d’éléments de liste ou tous les éléments à la fois.

Testé dans l'API 24.

0
Osify
    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
Nicu P