2010-11-03 84 views
15

我有一個ListView顯示了一些數據通過一個數組(這是在另一個類,我通過它的對象訪問它)。Android列表視圖刷新

每當我通過上下文菜單從ListView中刪除一個元素時,該列表不刷新,但元素將從數組中刪除。我如何刷新列表才能顯示此內容?

代碼:

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

回答

38

你必須通知該數據已經改變了你的ListView適配器。

listViewAdapater.notifyDataSetChanged(); 

如果由於某種原因不工作,有它喜歡它似乎並沒有通知一些奇怪的情況下,你可以通過用更新的數組構造重新分配您的適配器。

+0

我在哪裏需要放這條線? stockname.remove(post-1)後面的 – 2010-11-03 15:51:46

+1

; listViewAdapter只是一個例子,你必須用你的適配器被調用的東西來代替它。如果你不能訪問它,只需將它作爲該類的全局變量。 – blindstuff 2010-11-03 15:52:56

+4

嘗試重新初始化適配器,就像您在創建適配器時一樣。 – blindstuff 2010-11-03 16:00:42

4

我沒有notifyDataSetChanged()方法(Android 2.3)。

以下爲我工作:

getListView().invalidate(); 

在我來說,我已經改變了整個適配器,它仍然沒有刷新,所以對我來說上述方法是唯一可行的解​​決方案。

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

您需要使您的列表無效()。在我的情況下,我使無效()列表,用空元素初始化列表,然後重新初始化我的列表 – 2016-07-18 21:14:36

0

列表刷新對我來說:listView.invalidateViews();

它會做:

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

的情況下,管理某些列表項刪除或移除所有元素立刻。

在API 24中測試。