Android 如何避免碎片';导航抽屉打开后是否刷新列表?

Android 如何避免碎片';导航抽屉打开后是否刷新列表?,android,android-fragments,android-listview,navigation-drawer,Android,Android Fragments,Android Listview,Navigation Drawer,我在MainActivity中的片段和导航抽屉中有列表。从NavigationDrawer我称之为片段。当我滚动一点并再次打开NavigationDrawer时,列表将刷新并从顶部开始。我猜主要原因是设置选项菜单(true)因为当我评论这行时,一切都正常,但我在ActionBar中的搜索不起作用 当我滚动一点时: 它应该是什么样子的: 它的实际外观: 我的片段: @Override public View onCreateView(LayoutInflater inflater, ViewGr

我在MainActivity中的片段和导航抽屉中有列表。从NavigationDrawer我称之为片段。当我滚动一点并再次打开NavigationDrawer时,列表将刷新并从顶部开始。我猜主要原因是
设置选项菜单(true)因为当我评论这行时,一切都正常,但我在ActionBar中的搜索不起作用

当我滚动一点时:

它应该是什么样子的:

它的实际外观:

我的片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.alllists, container, false);
    View header = inflater.inflate(R.layout.list_header, null);
    ImageView image = (ImageView) header.findViewById(R.id.small_icon);
    navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
    Bundle bundle = getArguments();
    position = bundle.getInt("position");
    location = bundle.getString("location");
    image.setImageDrawable(navMenuIcons.getDrawable(position));
    context = getActivity().getApplicationContext();
    DatabaseHandler db = new DatabaseHandler(context);
    items = db.getAllItems(location);
    tmp_items = db.getAllItems(location);
    listView = (ListView) rootView.findViewById(R.id.list);
    adapter = new CustomListAdapter(context, items);
    listView.addHeaderView(header, "", false);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        }
    });
    setHasOptionsMenu(true);
    return rootView;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            if (TextUtils.isEmpty(s)) {
                adapter = new CustomListAdapter(context, tmp_items);
                listView.setAdapter(adapter);
            }
            if (tmp_s.length() > s.length()) {
                adapter.getFilter(tmp_items, true).filter(s);
            } else {
                adapter.getFilter(tmp_items, false).filter(s);
            }
            tmp_s = s;
            return false;
        }
    });
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    mSearchView.setQuery("", false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
主要活动:

public static AllLists mainFragment = null;

 ...

public static void setMainFragment(AllLists fragment) {
    mainFragment = fragment;
}

public static AllLists getMainFragment() {
    return mainFragment;
}
为了清楚起见,我改变了我的片段如下:

getSupportFragmentManager()
       .beginTransaction()
       .replace(R.id.frame_container, AllLists.newInstance(position, location))
       .commit();

问题是,每次返回片段视图时,它都会被重置

为了不丢失主片段的状态,您应该在newIntance方法中只执行一次“new fragment()”。您可以创建一个全局变量,比如“mainFragment”,存储一次创建的新片段(),然后检查您的全局变量(即“mainFragment”)是否为null,然后返回mainFragment

这会解决你的问题。但在屏幕上旋转时,仍然会创建一个新实例,从而再次将您带回到列表的顶部。有关旋转问题,请参见:

您的片段可以为活动的选项提供菜单项 通过实现 onCreateOptions菜单()。为了使此方法接收调用, 但是,必须在onCreate()期间调用setHasOptions菜单(),以 指示片段要将项目添加到选项菜单 (否则,片段将不会收到对的调用。) onCreateOptions菜单()

因此,让我们移动
设置选项菜单(true)
onCreateView(…)
调用到片段中的
onCreate(…)
覆盖:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.alllists, container, false);
    View header = inflater.inflate(R.layout.list_header, null);
    ImageView image = (ImageView) header.findViewById(R.id.small_icon);
    navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
    Bundle bundle = getArguments();
    position = bundle.getInt("position");
    location = bundle.getString("location");
    image.setImageDrawable(navMenuIcons.getDrawable(position));
    context = getActivity().getApplicationContext();
    DatabaseHandler db = new DatabaseHandler(context);
    items = db.getAllItems(location);
    tmp_items = db.getAllItems(location);
    listView = (ListView) rootView.findViewById(R.id.list);
    adapter = new CustomListAdapter(context, items);
    listView.addHeaderView(header, "", false);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        }
    });
    setHasOptionsMenu(true);
    return rootView;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            if (TextUtils.isEmpty(s)) {
                adapter = new CustomListAdapter(context, tmp_items);
                listView.setAdapter(adapter);
            }
            if (tmp_s.length() > s.length()) {
                adapter.getFilter(tmp_items, true).filter(s);
            } else {
                adapter.getFilter(tmp_items, false).filter(s);
            }
            tmp_s = s;
            return false;
        }
    });
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    mSearchView.setQuery("", false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

我真的很喜欢模糊和手提包图标(看起来像一张脸)对不起,耽搁了,我不确定我做的每件事都是正确的。我已经更新了我的newInstance方法,但问题并没有消失。首先,您需要为实例化的片段保留一个全局变量。如果我没有错的话,我想你已经做了一个局部变量。请纠正它,请通过我的答案中的链接,这将解决您的所有问题,不仅与旋转相关,而且还可以用于您提到的问题。我通过了该链接,但我发现它与我的情况无关。我已经更新了我的问题并添加了我的MainActivity的方法,在那里我设置并获取了我的片段。我不知道为什么它不起作用,你已经按照我的说法正确地完成了所有事情。如果你能分享,请将你的代码上传到github,也许我可以复制它,并可能提供更多帮助,thx。很乐意提供帮助…看看您需要了解的有关片段的所有信息:请阅读链接中的“保存片段状态”主题。它说,默认情况下,如果所有片段都有ID,那么所有片段都会被保存,并且可以覆盖它。