如何刷新Android的ListView?
如何在添加/删除动态数据后刷新Android ListView
?
一旦您修改了该适配器中的数据,就可以在您的Adapter
对象上调用notifyDataSetChanged()
。
关于如何/何时调用notifyDataSetChanged()
一些额外细节可以在此Google I / O视频中查看。
你也可以使用这个:
myListView.invalidateViews();
请享用!
请忽略所有invalidate()
, invalidateViews()
, requestLayout()
,......这个问题的答案。
正确的做法(幸运地也被标记为正确的答案)是在你的适配器上调用notifyDataSetChanged()
。
故障排除
如果调用notifyDataSetChanged()
不起作用,所有的布局方法都不会有帮助。 相信我ListView
已被正确更新。 如果您无法找到差异,则需要检查适配器中的数据来自何处。
如果这只是您保存在内存中的集合,请在调用notifyDataSetChanged()
之前检查是否实际删除了项目或将项目添加到了集合中。
如果您正在使用数据库或服务后端,则必须在调用notifyDataSetChanged()
之前调用该方法来再次检索信息(或处理内存数据notifyDataSetChanged()
。
事情是这个notifyDataSetChanged
只适用于数据集已经改变。 所以如果你没有发现变化,那就是你要看的地方。 如果需要调试。
ArrayAdapter vs BaseAdapter
我确实发现使用可以让你管理集合的适配器工作,就像BaseAdapter一样,效果更好。 像ArrayAdapter这样的适配器已经管理好自己的集合,这使得难以获得适当的更新集合。 在大多数情况下,这只是一个不必要的额外困难。
UI线程
确实,这必须从UI线程中调用。 其他答案有如何实现这一目标的例子。 但是,只有在您从UI线程之外处理这些信息时才需要。 这是来自服务或非UI线程。 在简单情况下,您将通过点击按钮或其他活动/片段来更新数据。 所以仍然在UI线程内。 不需要总是弹出runOnUiTrhead进来。
快速示例项目
可以在https://github.com/hanscappelle/so-2250770.git找到。 只需克隆并在Android Studio(gradle)中打开该项目即可。 这个项目有一个MainAcitivity构建一个包含所有随机数据的ListView
。 该列表可以使用操作菜单进行刷新。
我为这个示例ModelObject创建的适配器实现公开了数据收集
public class MyListAdapter extends BaseAdapter {
/**
* this is our own collection of data, can be anything we
* want it to be as long as we get the abstract methods
* implemented using this data and work on this data
* (see getter) you should be fine
*/
private List<ModelObject> mData;
/**
* our ctor for this adapter, we'll accept all the things
* we need here
*
* @param mData
*/
public MyListAdapter(final Context context, final List<ModelObject> mData) {
this.mData = mData;
this.mContext = context;
}
public List<ModelObject> getData() {
return mData;
}
// implement all abstract methods here
}
来自MainActivity的代码
public class MainActivity extends Activity {
private MyListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView list = (ListView) findViewById(R.id.list);
// create some dummy data here
List<ModelObject> objects = getRandomData();
// and put it into an adapter for the list
mAdapter = new MyListAdapter(this, objects);
list.setAdapter(mAdapter);
// mAdapter is available in the helper methods below and the
// data will be updated based on action menu interactions
// you could also keep the reference to the android ListView
// object instead and use the {@link ListView#getAdapter()}
// method instead. However you would have to cast that adapter
// to your own instance every time
}
/**
* helper to show what happens when all data is new
*/
private void reloadAllData(){
// get new modified random data
List<ModelObject> objects = getRandomData();
// update data in our adapter
mAdapter.getData().clear();
mAdapter.getData().addAll(objects);
// fire the event
mAdapter.notifyDataSetChanged();
}
/**
* helper to show how only changing properties of data
* elements also works
*/
private void scrambleChecked(){
Random random = new Random();
// update data in our adapter, iterate all objects and
// resetting the checked option
for( ModelObject mo : mAdapter.getData()) {
mo.setChecked(random.nextBoolean());
}
// fire the event
mAdapter.notifyDataSetChanged();
}
}
更多信息
另一个关于listViews的力量的好帖子可以在这里找到:http://www.vogella.com/articles/AndroidListView/article.html
链接地址: http://www.djcxy.com/p/67335.html上一篇: How to refresh Android listview?
下一篇: Repetition of image while scrolling in Android grid view using Universal Image Loader