Android列表视图刷新
问题描述:
我有一个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;
}
答
你必须通知该数据已经改变了你的ListView适配器。
listViewAdapater.notifyDataSetChanged();
如果由于某种原因不工作,有它喜欢它似乎并没有通知一些奇怪的情况下,你可以通过用更新的数组构造重新分配您的适配器。
答
我没有notifyDataSetChanged()
方法(Android 2.3)。
以下为我工作:
getListView().invalidate();
在我来说,我已经改变了整个适配器,它仍然没有刷新,所以对我来说上述方法是唯一可行的解决方案。
答
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
答
列表刷新对我来说:listView.invalidateViews();
它会做:
mDataChanged = true;
rememberSyncState();
requestLayout();
invalidate();
的情况下,管理某些列表项删除或移除所有元素立刻。
在API 24中测试。
我在哪里需要放这条线? stockname.remove(post-1)后面的 – 2010-11-03 15:51:46
; listViewAdapter只是一个例子,你必须用你的适配器被调用的东西来代替它。如果你不能访问它,只需将它作为该类的全局变量。 – blindstuff 2010-11-03 15:52:56
尝试重新初始化适配器,就像您在创建适配器时一样。 – blindstuff 2010-11-03 16:00:42