============问题描述============
两个Activity,A和B。
A里边主要有一个listview,显示数据库里的东西;B由A跳转过来,里边有一些操作,2个按钮X和Y,X是直接返回A,Y是更新数据库然后返回A。
问题在这里:A跳转B时,没有使用finish(),这样X就可以finish()掉B直接就返回A了,A也不用重新绘制布局,这没问题。但是Y操作回到A我就不会了,这时回到A需要更新其中内容了(重新绘制布局)。我尝试用startActivityForResult来跳转,Y操作后在A的onActivityResult里执行更新listview的适配器,但是运行后A仍然没有发生刷新(但是onActivityResult里的Toast是执行了),也没报错。是我刷新listview的操作不对吗?
求指教
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==RESULT_OK){
Toast.makeText(this, "OK", Toast.LENGTH_SHORT).show();
myAdapter=new MyActivityAdapter(MyActivity.this,annList);
myAdapter.notifyDataSetChanged();
listview.setAdapter(myAdapter);
}
}
============解决方案1============
创建Adapter和setAdapter不要在OnActivityResult函数里调用,而是应该在onCreate里调用。
onActivityResult里只要修改数据对象annList,然后调用notifyDataSetChanged就可以。
============解决方案2============
引用 6 楼 TheUnforgiven 的回复:
Quote: 引用 3 楼 kifile 的回复:
额,刚才没看清楚代码,你的问题其实是 myAdapter 设置错误,,你在 onActivityResult 中重新初始化了 myAdapter, 先调用了 notify,然后才 set,你可以更改一下顺序呢,,,不过建议是只更改 mAdapter 中的数据,不要重新初始化,然后直接使用 notifyDataChanged 就好了
问题最终解决了,还是onActivityResult里边的问题:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==RESULT_OK){
Toast.makeText(this, "OK", Toast.LENGTH_SHORT).show();
annList=getData();
myAdapter=new MyActivityAdapter(MyActivity.this,annList);
listview.setAdapter(myAdapter);
}
}
可能是我的代码的结构有问题吧,我的MyActivityAdapter是单独一个class文件,没有放在MyActivity.class里,所以只能先new,再setAdapter。ps:我这样结构不合理吗?
这个无所谓 Adapter 的位置的,主要是你的 annList 是通过 getData()获取的,相当于一个新的 list, 因此你调用 notifyDataChange 的时候,数据其实是没有更新的,正确的使用方式是 annList.clear(); annList.addAll(getData());,myAdapter.notifyDataChanged();