关于simpleAdapter刷新的问题(如何利用notifyDataSetChanged())

jesse1989 2011-04-12 06:27:26
先来描述下我想实现的功能,长按条目后,选择删除,然后会弹出提示dialog,点击确定则将该条目从数据库中删除,同时视图上也随之被删除

相关代码



private SimpleAdapter restaurantListAdapter=null;

@Override
protected void onResume(){
super.onResume();
//利用simpleAdapter
restaurantListAdapter=new SimpleAdapter(this, getListForSimpleAdapter(), R.layout.restaurant_list_item,
new String[]{"restName","Tel"}, new int[]{R.id.titleTextView,R.id.telTextView});
getListView().setTextFilterEnabled(true);
getListView().setAdapter(restaurantListAdapter);
Logger.d("on ruseme");
}


getListForSimpleAdapter()方法(返回list)

private List<Map<String, Object>> getListForSimpleAdapter(){
List<Map<String,Object>> list=new ArrayList<Map<String, Object>>();
int n = locandrest.queryLocAndRestByLocId(locID, this).size();
Logger.d("The number of Restaurant with locID = "+locID+" is "+n);
Long restID=null;
String RestaurantName=null;
String TelNum =null;
for(int i = 0; i<n; i++){
restID= LocAndRest.queryLocAndRestByLocId(locID, this).get(i).getRestId();
Logger.d("restID is "+restID);
RestaurantName = restaurant.queryRestaurantById(restID, this).getName();
TelNum=restaurant.queryRestaurantById(restID, this).getRestTelNumber();
Map<String, Object> map = new HashMap<String, Object>();
map.put("restName", RestaurantName);
map.put("Tel", "Tel: "+TelNum);
map.put("restID", restID);

list.add(map);
}

return list;
}


dialog上删除按钮的监听


//删除按钮监听_____________________________未完成 有误(无法刷新)
protected DialogInterface.OnClickListener deleteRestButtonListener(){
return new DialogInterface.OnClickListener() {
@SuppressWarnings("unchecked")
public void onClick(DialogInterface dialog, int id) {

Map<String,Object> mapRest =(Map<String, Object>) restaurantListAdapter.getItem(positionOfItem);
positionId=(Long) mapRest.get("restID");

deleteRestaurant(positionId);
String str = "The restaurant which restId (positionId) is "+positionId+"is deleted in Restaurant Table";
Logger.d(str);

getListForSimpleAdapter().remove(positionOfItem);

Logger.d("the size of list is "+getListForSimpleAdapter().size());
SimpleAdapter sa= (SimpleAdapter) getListView().getAdapter();

sa.notifyDataSetChanged();

removeDialog(CONFIRM_DELETE_DIALOG);//清除缓存
}

};
}



但是运行后发现,条目的确是被删除了(从数据库中可以查到),或者后退重新进入该activity可以看出被删除了
但是在操作的时候(即在dialog上点击删除)并没有对应刷新列表,
该怎么解决呢 或者是我哪里写的有误,请指点
...全文
6920 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fylou 2013-10-23
  • 打赏
  • 举报
回复
使用SimpleAdapter 创建的list,是不能通过notifyDataSetChanged 来更新的,因为SimpleAdapter 主要是用来创建静态的数据的列表,如果要实现动态更新数据,需要自己定义一个基于BaseAdapter的adapter,然后通过notifyDataSetChanged 来更新list。
summerDG 2013-09-27
  • 打赏
  • 举报
回复
应该把需要隐藏/显示的那个控件findViewById放在getView函数if...else...判断的外边,就是每次都进行刷新那个控件
xzowo 2013-06-13
  • 打赏
  • 举报
回复
那应该如何修改呢 ??
Android_OuYang 2011-10-27
  • 打赏
  • 举报
回复
正好遇到了这个问题,学习了
chenshantie 2011-09-09
  • 打赏
  • 举报
回复
新手经过,学习了,各位大侠。
jesse1989 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ykdsea 的回复:]

这个是你的代码写的有问题,getListForSimpleAdapter()每次都返回一个新的对象了,也就是你在删除一个item的时候,删除的不是你adapter中使用的那个list,这样的话,当然notifydatachanged没有效果,因为adapter使用的list本来就没有发生改变。
[/Quote]

恩 你是对的,多谢多谢
sky-Z 2011-04-20
  • 打赏
  • 举报
回复
这个是你的代码写的有问题,getListForSimpleAdapter()每次都返回一个新的对象了,也就是你在删除一个item的时候,删除的不是你adapter中使用的那个list,这样的话,当然notifydatachanged没有效果,因为adapter使用的list本来就没有发生改变。
jesse1989 2011-04-17
  • 打赏
  • 举报
回复
没人回复了,额 虽然解决了 但是不是notifyDataSetChanged()起的效果啊
jesse1989 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ykdsea 的回复:]

notifyDataSetChanged()中会去对做UI的刷新动作,这个动作最好放在对应的UI线程中。
所以这样试下:
在主activity中建立一个handler,然后把dialog里面的sa.notifyDataSetChanged();改成发送消息到actvity,在handle的处理中调用notifyDataSetChanged();
[/Quote]
你好,我按照你的方法修改了,也成功了,但还有点问题,先看下我修改的部分吧

//线程处理
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REFRESH_LISTVIEW:
Logger.d("call the handler to refresh listview");

/* SimpleAdapter sa= (SimpleAdapter) getListView().getAdapter();
sa.notifyDataSetChanged();*/
restaurantListAdapter=new SimpleAdapter(RestaurantList.this, getListForSimpleAdapter(), R.layout.restaurant_list_item,
new String[]{"restName","Tel"}, new int[]{R.id.titleTextView,R.id.telTextView});
getListView().setTextFilterEnabled(true);
getListView().setAdapter(restaurantListAdapter);
break;
default:
Logger.d("unknown message to handler");
break;
}
}
};


删除按钮消息发送部分
Message message = new Message();  
message.what=REFRESH_LISTVIEW;
handler.sendMessage(message);


我在处理消息的方法里开始用的是
 SimpleAdapter sa=   (SimpleAdapter) getListView().getAdapter();
sa.notifyDataSetChanged()

也就是注释掉的部分,没效果
后来改成重新new 了下才有效果
也就是说notifyDataSetChanged这个实际上没有起作用啊 这是为什么呢 还是我哪里有误
麻烦再看看了 多谢
jesse1989 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ykdsea 的回复:]

notifyDataSetChanged()中会去对做UI的刷新动作,这个动作最好放在对应的UI线程中。
所以这样试下:
在主activity中建立一个handler,然后把dialog里面的sa.notifyDataSetChanged();改成发送消息到actvity,在handle的处理中调用notifyDataSetChanged();
[/Quote]

多谢 我试试去 之前没想到这个问题
yongyuandeni 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ykdsea 的回复:]

notifyDataSetChanged()中会去对做UI的刷新动作,这个动作最好放在对应的UI线程中。
所以这样试下:
在主activity中建立一个handler,然后把dialog里面的sa.notifyDataSetChanged();改成发送消息到actvity,在handle的处理中调用notifyDataSetChanged();
[/Quote]

支持
sky-Z 2011-04-12
  • 打赏
  • 举报
回复
notifyDataSetChanged()中会去对做UI的刷新动作,这个动作最好放在对应的UI线程中。
所以这样试下:
在主activity中建立一个handler,然后把dialog里面的sa.notifyDataSetChanged();改成发送消息到actvity,在handle的处理中调用notifyDataSetChanged();

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧