所有资讯
微信公众号
微信小程序
手机App

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

浏览量:1037    日期: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();

    }

}


 
成为您更加专业的技术合伙人
服务热线:15165022080
加微信号:15165022080
客服QQ:1828087588、1421667633
电子邮箱:1828087588@qq.com
 
软件开发咨询:15165022080