2010-11-03 21 views
15

Ho un ListView che mi mostra alcuni dati attraverso un array (che si trova in un'altra classe e sto accedendo tramite il suo oggetto).Aggiornamento elenco elenco Android

Ogni volta che si elimina un elemento da ListView tramite il menu di scelta rapida, l'elenco non si aggiorna ma l'elemento viene eliminato dall'array. Come posso aggiornare l'elenco per mostrarlo?

Codice:

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

risposta

38

Bisogna informare l'adattatore ListView che i dati sono cambiati.

listViewAdapater.notifyDataSetChanged(); 

Se che per qualche ragione non funziona e ci sono alcune situazioni in cui suoni bizzarri sembra che non è stato di notifica, si può semplicemente riassegnare l'adattatore tramite il costruttore con la matrice aggiornata.

+0

dove devo mettere questa linea? –

+1

subito dopo stockname.remove (post-1); listViewAdapter è solo un esempio, devi sostituirlo con ciò che viene chiamato il tuo adattatore. Se non puoi accedervi, basta renderlo una variabile globale per quella classe. – blindstuff

+4

Prova a reinizializzare l'adattatore, proprio come hai fatto quando lo hai creato. – blindstuff

4

Non ho il metodo notifyDataSetChanged() (Android 2.3).

Di seguito ha lavorato per me:

getListView().invalidate(); 

Nel mio caso ho cambiato l'intero adattatore e ancora non ha aggiornare, quindi per me il metodo sopra descritto è l'unica soluzione di lavoro.

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

È necessario invalidare() l'elenco. nel mio caso investo() l'elenco, inizializza l'elenco con elementi null e quindi reinizializza il mio elenco –

0

Lista rinfrescante per me: listView.invalidateViews();

lo farà:

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

Il caso, come per gestire alcune rimozione elemento di elenco o la rimozione tutti gli elementi subito.

Testato in API 24.