首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >notifyDataSetChanged();在安卓系统中不起作用

notifyDataSetChanged();在安卓系统中不起作用
EN

Stack Overflow用户
提问于 2016-07-13 14:30:19
回答 2查看 93关注 0票数 0

这是我的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.recycler_list, container, false);
    recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3);

    adapter = new FragmentBrandList.MyAdapter(Utility.getBrandMap(), getActivity());
    recyclerView.setAdapter(adapter);

    // asynchronous call
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                Brand brand = dataSnapshot1.getValue(Brand.class);
                brandMap.put(brand.getId(), brand);
            }

            Utility.setBrandMap(brandMap);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
            Utility.displayToast("Failed to read value." + error.toException());
        }
    });
    return v;
}

最初,Utility.getBrandMap()为空。所以什么都没有显示。但是在异步调用中,我会获取并更新值,并调用adapter.notifyDataSetChanged();但它仍然不会更新UI。

这里出了什么问题?

编辑:适配器代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<Brand> brandList = new ArrayList<>();
    private Context context;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        public MyViewHolder(View view) {
            super(view);
            imageView = (ImageView) view.findViewById(R.id.thumbnail);
        }
    }

    public MyAdapter(Map<String, Brand> brands, Context context) {
    //public MyAdapter(List<Brand> brands, Context context) {
        this.brandList = new ArrayList<>(brandMap.values());
        //this.brandList = brands;
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_brand, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        if (brandList != null && brandList.size() > 0) {
            Brand brand = brandList.get(position);
            Glide.with(context).load(String.valueOf(brand.getImage()))
                    .error(R.drawable.placeholder)
                    .placeholder(R.drawable.placeholder)
                    .into(holder.imageView);
        }
    }

    @Override
    public int getItemCount() {
        return brandList.size();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-07-13 14:45:28

试试这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.recycler_list, container, false);
    recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 3);

    adapter = new FragmentBrandList.MyAdapter(Utility.getBrandMap(), getActivity());
    recyclerView.setAdapter(adapter);

    // asynchronous call
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                Brand brand = dataSnapshot1.getValue(Brand.class);
                brandMap.put(brand.getId(), brand);
            }

            adapter.setBrandMap(brandMap);

        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
            Utility.displayToast("Failed to read value." + error.toException());
        }
    });
    return v;
}

在适配器代码中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<Brand> brandList = new ArrayList<>();
    private Context context;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        public MyViewHolder(View view) {
            super(view);
            imageView = (ImageView) view.findViewById(R.id.thumbnail);
        }
    }

    public MyAdapter(Map<String, Brand> brands, Context context) {
    //public MyAdapter(List<Brand> brands, Context context) {
        this.brandList = new ArrayList<>(brandMap.values());
        //this.brandList = brands;
        this.context = context;
    }

    public void setBrandMap(Map<String, Brand> brandMap){
      this.brandList = new ArrayList<>(brandMap.values());
      notifyDataSetChanged();
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_brand, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        if (brandList != null && brandList.size() > 0) {
            Brand brand = brandList.get(position);
            Glide.with(context).load(String.valueOf(brand.getImage()))
                    .error(R.drawable.placeholder)
                    .placeholder(R.drawable.placeholder)
                    .into(holder.imageView);
        }
    }

    @Override
    public int getItemCount() {
        return brandList.size();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-07-13 14:45:28

您正在向MyAdapter的构造函数传递一个空的Map。一旦异步查询完成,映射就被填满了,但是适配器中的brandList并不知道任何关于新数据的信息。因此,您要做的是将新项添加到适配器内的List中。

将以下方法添加到适配器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void addValues(Map<String, Brand> brands){
    brandList.clear();
    brandList.addAll(brands.values());
    notifyDataSetChanged();
}

并在异步查询完成后调用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38354555

复制
相关文章
RecyclerView.Adapter notifyDataSetChanged 不起作用
如果应用启动,不在聊天界面,接收到消息后就弹出通知栏消息通知用户,点击进入聊天界面。
张拭心 shixinzhang
2022/05/06
3K0
Android--SVG在安卓系统中的应用
通过使用它的Path标签,几乎可以实现SVG中的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。
aruba
2020/07/03
2.8K0
安卓系统框架介绍(安卓常用框架)
——源码地址1: https://android.googlesource.com/
全栈程序员站长
2022/07/30
8.7K0
安卓系统框架介绍(安卓常用框架)
听说你们家的NotifyDataSetChanged不起作用了
前几天,公司项目准备上线,就在前一晚,出现了一个BUG:主页界面刷新无效。千钧一发之际,用了一个笨方法,每次刷新的时候重新setAdapter一下算是实现了基本功能,但是这样显然效率不高,数据很多的时候容易卡顿。当时时间紧也就没有对问题作过多的了解,现在回过头来对NotifyDataSetChanged无效的问题进行分析。
代码咖啡
2018/08/28
1.9K0
听说你们家的NotifyDataSetChanged不起作用了
安卓系统usb调试在哪_安卓手机的usb调试
Android手机USB调试在哪?安卓手机如何打开USB调试模式?如果我们要将安卓手机连接到电脑上,从而传输文件、下载应用或ROOT等,都需要打开手机的USB调试模式。安卓系统的版本有很多,它们的打开方法也各不相同,下面给大家介绍各版本安卓手机打开USB调试模式的方法。
全栈程序员站长
2022/09/30
3.8K0
安卓再现系统广播高危漏洞,影响99.9%安卓手机
近日,有博客披露安卓系统存在安卓系统广播漏洞,99.9%的安卓手机将面临安全威胁。恶意程序利用该漏洞,可伪造任意内容的手机短信,及致手机死机,甚至可将手机恢复出厂设置(所有数据将被擦除)。该漏洞目前影响5.0版本以下99.9%的安卓系统手机。 安全专家研究发现,谷歌在刚刚发布的安卓系统5.0(Lolipop)中悄悄修复了一项高危漏洞,“利用该漏洞,可以发送任意广播:不仅可以发送系统保护级别的广播、还可以无视receiver的android:exported=false、android:permisson
安恒信息
2018/04/10
3.3K0
安卓再现系统广播高危漏洞,影响99.9%安卓手机
unicorn在安卓中使用
https://github.com/RikkaApps/Riru/releases
tea9
2023/03/08
9450
安卓仓库管理系统源码
大等于jdk1.8,大于mysql5.5,idea(eclipse),Android Studio
淘毕设
2022/07/17
2.3K0
使用Scrcpy在Linux操控安卓
在 Windows 上系统自带了投屏功能,然而 deepin 也有 深度演示助手 ,不过我并没有在系统中找到。论坛中的反响都是在 15 版本,现在已经是 20.2 了。
caoayu
2021/03/11
4.4K0
鸿蒙系统与安卓系统的区别
华为鸿蒙已经发布快一年了,但是经常还有小伙伴说,鸿蒙不就是安卓系统套个壳么?类似小米的米UI和华为自有的EMUI。 我们不可否认鸿蒙2.0系统跟安卓的界面确实很相似,但就因此判定鸿蒙系统是安卓换皮了吗? 都知道鸿蒙系统跟安卓一样,采用的是AOSP 开源代码,而安卓自身超过80%的代码都来自于开源项目,谁也不能说谁在换皮吧? 长期以来,谷歌Android和苹果iOS系统占据了全球移动端操作系统的绝大多数市场份额,除了苹果的IOS以外,其他手机基本使用的就是安卓系统,当然,鸿蒙推出以后就三分天下啦。 对于很多
老九君
2022/04/29
5.5K0
鸿蒙系统与安卓系统的区别
安卓中的数据存取
在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式:Preference,File,Sqlite和网络,可以根据程序的实际需求选择合适的存取方式。
牛老师讲GIS
2018/10/23
1.3K0
安卓中的数据存取
使用Clang编译C程序在安卓设备中执行
在android-ndk-r19c目录下toolchains文件夹中的llvm文件夹即为clang编译工具包
乱码三千
2021/08/24
3.1K0
harmonyos系统与安卓区别(uAndroid)
这段时间我在寻思着学习一下鸿蒙, 第一是因为在着手做一个自己的开源项目,技术选型的时候想到了鸿蒙; 第二是我个人非常看好鸿蒙系统的未来,清楚明白华为和一些民族企业担负的责任和国人的期待,虽然带着一些民族感情;鸿蒙刚发布的时候自己是非常激动的,但是后来项目太忙一直没有认真的去了解过,这次打算花一部分时间认认真真的去研究学习一下。 于是我开始试探性的去请教身边的大佬们,公司的CTO、中台部门的总监、老东家数十年行业经验的老架构、以及在中科院读研究生的大学老室友、技术圈的网友等等,他们都给出了自己独特的看法,让我从多方面更好的去了解到了大家对鸿蒙的认识,当然期间也发现很多国内开发者对鸿蒙系统嗤之以鼻或者抱着一些不太看好的心态,甚至有人在我的关于鸿蒙开发的博客下评论一些比较难听的话!(当然一千个读者有一千个哈姆雷特,这都是个人自由); 这肯定是一篇遭到唾弃的文章!但这一切都无法磨灭我坚定的信仰:支持国产、支持民族企业、支持每一个为国家富强而努力的同胞! ​
全栈程序员站长
2022/07/29
2.1K0
harmonyos系统与安卓区别(uAndroid)
安卓系统签名方法2则
最近一个安卓的项目,本来是使用安卓板4.2的;但由于生产需求将原来的单板集成到整体(显示触屏+安卓)。由于其提供的样板是6.0。整个程序的主功能运行还可以,就是无法写日志和播放本地视频。于是研究一下,发现原来是他们提供的安卓未root导致的。于是跟供应商联系给root文件,谁知这丫的不给,就给了个安卓的系统签名。。好吧,给系统签名就重新编译吧。但过程不是太顺利,花了差不多一天时间进行处理;总算搞掂,现在分享一下成果吧。
谭广健
2020/01/16
1.8K0
Windows 11 运行安卓子系统
设置 → 应用 → 可选功能 → 更多 Windows 功能 → 勾选“虚拟机平台” → 确定,或者直接运行optionalfeatures打开Windows功能:
AiDBA宝典
2023/04/26
2.3K0
Windows 11 运行安卓子系统
MacDroid安卓设备传输助手,帮你在Mac电脑上传输安卓文件
安卓文件在Mac电脑上无法传输?你需要一款安卓设备传输工具!MacDroid Mac版是一款强大的安卓设备传输助手,使用非常简单,只需要将安卓手机使用 USB 连接到 Mac 电脑上即可将安卓设备挂载为本地磁盘,就像编辑mac磁盘上的文件一样编辑安卓设备上的文件,MacDroid支持所有 Android 和 MTP设备。
啾咪啾咪
2023/02/15
1.2K0
安卓 training-使用系统权限
每款 Android 应用都在访问受限的沙盒中运行。如果应用需要使用其沙盒外的资源或信息,则必须请求相应权限。您可以在应用清单中列出相应的权限,声明应用需要此权限。 根据权限的敏感性,系统可能会自动授予权限,或者需要由设备用户对请求进行许可。例如,如果您的应用请求打开设备手电筒的权限,系统将自动授予该权限。但如果您的应用需要读取用户联系人,系统会要求用户授权。 用户需要在安装应用(运行 Android 5.1 和更低版本的设备)或者运行应用(运行 Android 6.0 和更高版本的设备)时授予权限,具体取决于平台版本。
acc8226
2022/05/17
1.8K0
ONLYOFFICE更新5.6安卓系统了
今天我来介绍一个可以随时随地进行文档在线编辑和分享的靠谱办公类软件—ONLYOFFICE,经常出差在外的人难免会遇到要对文档进行修改时候,真正能解决编辑问题的软件不多,编辑功能不理想,甚至编辑完后文档内容都会出现丢失,且不能对文件进行有效地管理,更不能全面满足移动办公的需求。 在线存储、编辑及同步协作,为移动办公而生的软件。下面我来具体介绍一下这ONLYOFFICE移动版本。
用户10264843
2023/03/31
2.1K0
安卓 toast_安卓toast使用
一个 toast 是在屏幕上弹出一条信息,它的大小总是包裹着需要显示的内容,并且当前的 Activity 依然是可见并且可互动的。toast会自动消失,并且不接受任何互动事件。因为 toast 可以在后台的 Service 中创建,所以即使这个应用程序没有显示在屏幕上,仍然可以弹出 toast.
全栈程序员站长
2022/10/01
6.5K0
如何从电脑直接控制安卓手机 监控安卓手机 安卓手机如何控制安卓手机
实用方法很简单,在手机上安装这个软件,然后运行,然后进入Setting,点击User's settings,然后Create new user(我新建了一个叫做ACE的用户),注意这里在豌豆荚的截图只是做教程用的,实际不需要连接豌豆荚,甚至不需要WIFI,只要你打开了GPRS
程序员小顾
2021/12/01
16.7K0

相似问题

notifyDataSetChanged在安卓系统中不起作用

32

adapter.notifyDataSetChanged()在安卓系统中不起作用

20

notifyDataSetChanged();在安卓系统的ExpandableRecyclerAdapter中不起作用

34

notifyDataSetChanged在安卓系统中不起作用后的smoothScrollToPosition

27

安卓: notifyDataSetChanged不起作用

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文