当前位置 : 主页 > 手机开发 > android >

android – 配置更改后的notifyDataSetChanged

来源:互联网 收集:自由互联 发布时间:2021-06-11
我在更改设备配置(更改语言,方向等)后进行了一些测试,我注意到在此之后,方法“notifyDataSetChanged()”无法正常工作. 动作示例: 我每次执行删除,保存等操作时都会调用updateList().用户单
我在更改设备配置(更改语言,方向等)后进行了一些测试,我注意到在此之后,方法“notifyDataSetChanged()”无法正常工作.

动作示例:

我每次执行删除,保存等操作时都会调用updateList().用户单击删除按钮,会显示DialogFragment,“您确定要删除吗?”,当我更改方向时,或者语言或设备的任何配置,然后在对话框上单击“是”,数据将被删除,但列表不会更新.我需要退出活动,然后回去查看更改.

BookAdapter:

public void updateList(ArrayList<Book> books) {
     bookList = books;
     notifyDataSetChanged();
}

在配置更改后,我该怎么做才能使它工作?

编辑:

BookAdapter构造函数:

public BookAdapter(Context c, ArrayList<Book> books) {
    context = c;
    bookList = books
    bookDAO = BookDAO.getInstance(context);
}

BookFragment:

public class BookFragment extends Fragment {

    private BookDAO bookDAO;

    private BookAdapter bookAdapter;

    private ListView listBook;

    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        bookDAO = bookDAO.getInstance(getActivity());

        view = inflater.inflate(R.layout.book_tab, container, false);

        ArrayList<Book> listBook = null;

        try {
            llistBook = bookDAO.getAll();
        } catch (Exception e) {
            Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show();
            return view;
        }

        bookAdapter = new BookAdapter(getActivity(), listBook);
        listBook = (ListView)view.findViewById(R.id.listBook);
        listBook.setAdapter(bookAdapter);

        return view;

    }

}
出现问题的原因是每次轮换,更改语言等…重新创建活动并重新创建片段(新实例),因此notififyDataSetChanged实际上是通知片段的旧实例.
解决方案就是这样.使你的片段静止.然后为片段创建一些刷新方法,并在按下对话框时调用它.

在你的活动中你应该有这样的东西.

private static BookFragment  bookFragment;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    if (fragment1 == null) {
        bookFragment = new BookFragment();
    }

    ...
}

创建一些界面,如:

public interface Refreshable {
    public void refresh();
}

然后将所有片段实现此接口.
在对话框得到肯定回答时调用的方法中,您应该调用

...
fragment.refresh();
...

在你片段的刷新方法中你可以调用它的适配器方法updateList(…)

可能不是更漂亮的解决方案,但它的工作原理….

为什么会发生这种情况……谷歌的Android开发团队可能知道.

网友评论