菜鸟求助!listview的notifyDataSetChanged问题

mottretle 2014-04-16 05:50:38
本人在做一个类似微信的聊天软件,对方发了一句话后,我这里数据源改变了,adapter也notifyDataSetChanged,但显示聊天记录的listview没变。然后我弹出软键盘的时候,listview才改变
后来试过adapter的notifyDataSetInvalidated()和重新setAdapter都是同样的效果
notify什么的必须是在ui线程
...全文
2755 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
福临天下 2015-01-07
  • 打赏
  • 举报
回复
楼主 解决没有啊?
「已注销」 2014-12-18
  • 打赏
  • 举报
回复
估计是你的adapter问题,可以看下我的这个回复: http://bbs.csdn.net/topics/390950466
mykingbull 2014-12-18
  • 打赏
  • 举报
回复
解决了:我也遇到这个问题,后来发现是在其他线程中获取到数据,然后调用notifyDataSetChanged后没有生效,后来通过Handler把数据发回UI主线程,最后再调用notifyDataSetChanged才生效。

	
	public Handler handler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0: {
                String result = msg.getData().getString("msg");
                
        		IndividualApiVO individual = new IndividualApiVO();
        		individual.setSignature(result);
        		nearbyIndividuals.add(individual);
        		
        		nearByUserAdapter.notifyDataSetChanged();
            }
                break;
            default:
                break;
            }
        }
    };
    
	@Override
	public void onMessageArrive(Message message) {
		if (message == null) {
			return;
		}
		MessageApiVO notice = noticeManager.messageToNoticeObject(message);

        Bundle bd = new Bundle();
        bd.putString("msg", notice.getContent());

        android.os.Message msg = new android.os.Message();
        msg.what = 0;
        msg.setData(bd);
        
        handler.sendMessage(msg);
	}
飞奔的豆沙包 2014-08-02
  • 打赏
  • 举报
回复
listview.invalidate();是不是要调用这个东东呢,我也不太懂哈
sinat_17841263 2014-07-30
  • 打赏
  • 举报
回复
在return ConvertView前加adapter.notifyDataSetChanged();
hoew 2014-07-29
  • 打赏
  • 举报
回复
只能说这种莫名其妙的问题,需要加些调试代码,然后方便debug 1、在你调用adapter.notifyDataSetChanged是否确定数据源已经更新了? 你自己认为是更新了,那么你就在调用这句代码之前(最好是前一句),看看是否更新(打印或者debug看数据) 2、是否是更新了数据,但是在getView的时候,是否有逻辑代码,该条数据并没有加载对应的View出来 3、还有一种情况最J8,就是很多地方你try-catch了,所以没有报错,但是整个代码却没有执行完,就跳出了,这种最好是从拿到数据源到刷新UI,一句一句的跟 小弟拙见,希望对你有帮助
丰子 2014-07-29
  • 打赏
  • 举报
回复
引用 21 楼 mottretle 的回复:
[quote=引用 20 楼 a1031359915 的回复:] notifyDataSetChanged刷新是针对全局变量的list数据,只要在调用notifyDataSetChanged前保证list数据已添加进去了
在后台输出了确定数据已添加[/quote] 你后台输出的数据是适配器中list的还是UI中list的?
BennuCTech 2014-05-22
  • 打赏
  • 举报
回复
难道是焦点问题?俺瞎猜的
zolaZhang 2014-05-22
  • 打赏
  • 举报
回复
还没解决啊,求助啊
mottretle 2014-04-19
  • 打赏
  • 举报
回复
引用 20 楼 a1031359915 的回复:
notifyDataSetChanged刷新是针对全局变量的list数据,只要在调用notifyDataSetChanged前保证list数据已添加进去了
在后台输出了确定数据已添加
mottretle 2014-04-18
  • 打赏
  • 举报
回复
继续人工置顶求大神
丰子 2014-04-18
  • 打赏
  • 举报
回复
notifyDataSetChanged刷新是针对全局变量的list数据,只要在调用notifyDataSetChanged前保证list数据已添加进去了
huabei210 2014-04-18
  • 打赏
  • 举报
回复
试试listView setAdapter(new .Adapter);
mottretle 2014-04-17
  • 打赏
  • 举报
回复
召唤各种大神
mottretle 2014-04-17
  • 打赏
  • 举报
回复
引用 6 楼 hjywyj 的回复:
adapter代码贴出来看看
有没看出什么毛病
mottretle 2014-04-17
  • 打赏
  • 举报
回复
引用 16 楼 hjywyj 的回复:
adapter类中加个方法 public void SetData(List<Chat> coll){this.coll=coll;} notifyDataSetChanged 之前先调用这个方法如何呢?
不行- -
  • 打赏
  • 举报
回复
adapter类中加个方法 public void SetData(List<Chat> coll){this.coll=coll;} notifyDataSetChanged 之前先调用这个方法如何呢?
mottretle 2014-04-17
  • 打赏
  • 举报
回复
引用 14 楼 DuZuoZuoZuo 的回复:
是不是data数据源本身就没有发生改变
如果这样的话为毛弹出键盘就出现了新的数据
DuZuoZuoZuo 2014-04-17
  • 打赏
  • 举报
回复
是不是data数据源本身就没有发生改变
mottretle 2014-04-17
  • 打赏
  • 举报
回复
就在本activity下面 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.arg1 == 1) { dialog.dismiss(); mAdapter.notifyDataSetChanged(); mListView.setSelection(10); }else if(msg.arg1 == 2) { dialog.dismiss(); mAdapter.notifyDataSetChanged(); mListView.setSelection(msg.arg2); mListView.setOnScrollListener(null); Toast.makeText(getApplicationContext(), "加载完所有", Toast.LENGTH_SHORT).show(); }else if (msg.arg1 == 3){ dialog.dismiss(); mListView.setOnScrollListener(null); Toast.makeText(getApplicationContext(), "加载完所有", Toast.LENGTH_SHORT).show(); }else if (msg.arg1 == 4){ mAdapter.notifyDataSetChanged(); mListView.setSelection(mListView.getCount() - 1); }else if (msg.arg1 == -1){ }else { dialog.dismiss(); Toast.makeText(getApplicationContext(), "网络错误", Toast.LENGTH_SHORT).show(); } } }; 我这个问题只是出现在msg==4的时候,其它notify都工作正常
加载更多回复(10)

80,351

社区成员

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

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