Android列表视图刷新
我有一个ListView显示我通过数组(这是在另一个类,我通过它的对象访问它)的一些数据。
每当我通过上下文菜单从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; }
您必须通知您的ListView适配器数据已更改。
listViewAdapater.notifyDataSetChanged();
如果由于某种原因无法正常工作,并且出现了一些奇怪的情况,那么您可以通过构造函数重新分配适配器以更新数组。
我没有notifyDataSetChanged()
方法(Android 2.3)。
以下为我工作:
getListView().invalidate();
在我的情况下,我已经改变了整个适配器,它仍然没有刷新,所以对我来说,上述方法是唯一的工作解决scheme。
试试getListView()。 refreshDrawableState
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; } }
列表刷新我: listView.invalidateViews();
它会做:
mDataChanged = true; rememberSyncState(); requestLayout(); invalidate();
一次pipe理一些列表项删除或删除所有元素的情况。
在API 24中testing