为什么我的adapter.notifyDataSetChanged()不起作用?

1.一开始这样的:

case R.id.scann_button:
//发送扫描生成音乐列表广播
Intent broadcast_scann = new Intent();  
broadcast_scann.setAction(Constant.DB_SCANNMUSIC);  
            sendBroadcast(broadcast_scann);  
            
            //通知adapter数据更新
adapter.notifyDataSetChanged();
break;


错误原因:发送广播之后,系统立即执行的是下一句:adapter.notifyDataSetChanged();而此时adapter绑定的data并无更新。


2.处理完data之后再广播回activity,再调用adapter.notifyDataSetChanged();依然失效,代码如下:

 public void onReceive(Context context, Intent intent) {  
            try
            {  
                if (Constant.LISTVIEW_REFRESH.equals(intent.getAction()))
                {  
                System.out.print(Constant.data);
                adapter.notifyDataSetChanged();
                } 
            }
            catch (Exception e) 
            {  
                e.printStackTrace();  
            }  
        }

更新data相关代码:

public void query()
{
Constant.data = new ArrayList<Map<String, Object>>();
Map<String, Object> oneline = null;
Cursor cursor = db.rawQuery("select name,author,time,path from music_info", null);
while (cursor.moveToNext()) 
{
String name = cursor.getString(0); //获取第一列的值,第一列的索引从0开始
String author = cursor.getString(1);//获取第二列的值
String time = cursor.getString(2);//获取第三列的值
String path = cursor.getString(3);//获取第三列的值
oneline = new HashMap<String, Object>();
oneline.put("name", name);
oneline.put("author", author);
oneline.put("time", time);
oneline.put("path", path);
Constant.data.add(oneline);
}

}

原因:

其实adapter.notifyDataSetChanged();并不是对数据data本身的监听,而是对对原始数据源的监听;什么意思呢?就是说如果你是将原始data怎么add、remove、clear都可以,只要data还是对应的那块保存数据的内存;一旦你data = new 了一个新对象指向其他内存,你对新对象的任何改动都不会触发监听。例如上面的代码:

更新data使用了Constant.data = new ArrayList<Map<String, Object>>();

应此将此句改为Constant.data.clear(); 即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值