微信公众号制作开发 微信小程序定制开发 网站建设制作 手机app软件开发

您的位置:首页 > 技术观点 > 信息详情

Android中关于notifyDataSetChanged()方法的注意

来源:山东鸿软信息科技有限公司  阅读量:897  时间:2022-02-28 18:38
notifyDataSetChanged()方法的原理

1、首先介绍下notifyDataSetChanged()方法的原理,可参考:https://blog.csdn.net/q376794191/article/details/84448437


2、介绍下我在此处犯的错误:

public class HomeFragment extends BaseFragment implements HomeContract.View{

List<BookBean> allBooks;

//TypeBookAdapter是自定义的一个adapter类

    TypedBookAdapter adapter;


/*reFreshData的功能是想在MainActivity中刷新下HomeFragment类的对象homeFragment的数据,仅有allbooks的数据发生变化,adapter没有变*/

public void reFreshData(){

        DbHelper helper = new DbHelper(getContext());

        allBooks = helper.getAllBooks();

        getActivity().runOnUiThread(new Runnable() {

            @Override

            public void run() {

                adapter.notifyDataSetChanged();

                mRecyclerView.setAdapter(adapter);

            }

        });

        //System.out.println("refresh----"+allBooks.get(0).getLook_number());

        //update判定allBooks的内容是否发生了改变

        getContext().getSharedPreferences("book",MODE_PRIVATE).edit().putBoolean("update",false).commit();

    }

}

问题

在上述代码中发现adapter.notifyDataSetChanged()函数没有用,数据库中的数据其实已经改变了,但是为什么adapter不更新呢?


原因

经过好长时间的debug,终于发现原来是因为adapter本身没有改变,也就是说adapter在创建的时候传了allbooks过去,但是更新数据后没有对adapter中的allbooks改变,它仍然是初始化的时候的值,所以这时候在MainActivity中调用reFreshData()方法不会刷新数据。


解决办法

如下是他的解决办法

1、因为在TypedBookAdapter类中List books为私有成员变量,所以要想改变books的值必须先在TypedBookAdapter类中创建一个改变books值的公有方法。

public void setBooks(List<BookBean> books) {

        this.books = books;

}

2、然后在调用adapter.notifyDataSetChanged();之前把调用adapter.setBooks(allBooks)方法即可。

public class HomeFragment extends BaseFragment implements HomeContract.View{

List<BookBean> allBooks;

//TypeBookAdapter是自定义的一个adapter类

    TypedBookAdapter adapter;


/*reFreshData的功能是想在MainActivity中刷新下HomeFragment类的对象homeFragment的数据,仅有allbooks的数据发生变化,adapter没有变*/

public void reFreshData(){

        DbHelper helper = new DbHelper(getContext());

        allBooks = helper.getAllBooks();

        getActivity().runOnUiThread(new Runnable() {

            @Override

            public void run() {

                adapter.setBooks(allBooks);

                adapter.notifyDataSetChanged();

                mRecyclerView.setAdapter(adapter);

            }

        });

        //System.out.println("refresh----"+allBooks.get(0).getLook_number());

        //update判定allBooks的内容是否发生了改变

        getContext().getSharedPreferences("book",MODE_PRIVATE).edit().putBoolean("update",false).commit();

    }

}


成为您更加专业的技术合伙人

网站建设 | APP开发 | 产品服务 | 技术观点 | 关于我们      客服电子邮箱:1828087588@qq.com  客服QQ:1828087588、1421667633  电话:151-6502-2080

Copyright © 2016-2025 山东鸿软信息科技有限公司 版权所有 https://www.greatsoft.cn 鲁ICP备16026454号