【问题标题】:Android listfragment scrolls to the top [duplicate]Android listfragment滚动到顶部[重复]
【发布时间】:2013-10-21 06:46:34
【问题描述】:

我有一个列表片段。

当用户单击列表项时,我将列表片段替换为新闻片段。 当用户返回时(使用addToBackStack),列表滚动到顶部。

当用户按下列表项时,我希望我的列表保持相同的滚动级别。这可能吗?我怎样才能得到这个结果?

这是我替换列表片段的代码:

myFragment myFragment = new myFragment();

    myFragment.setArguments(bundle);
                FragmentTransaction ft = getActivity().getSupportFragmentManager()
                        .beginTransaction();
                ft.replace(R.id.phone_container, myFragment);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(null);
                ft.commit();

我尝试过类似的方法,但没有得到任何结果:

public void onResume() {
    super.onResume();
    Log.i("log", "onResume()");

      setListAdapter(adapter);
      if(index!=-1){
         this.getListView().setSelectionFromTop(index, top);
      }
}

public void onPause() {
    super.onPause();
    Log.i("log", "onPause()");
    try {
        index = this.getListView().getFirstVisiblePosition();
        View v = this.getListView().getChildAt(0);
        top = (v == null) ? 0 : v.getTop();
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

【问题讨论】:

  • 不,不是重复的。

标签: java android android-fragments fragment android-listfragment


【解决方案1】:

当您从视图层次结构中删除片段时,您实际上会破坏视图而不是片段。因此,当它重新连接时,它会再次调用 onCreateView。这就是您的列表再次滚动到顶部的原因。

保存状态的方法是将其存储在实例变量中,然后再次使用 onCreateView 滚动到您的代码所做的最后一个位置(当然是在适配器被填充之后)。

这可能有助于了解更多详细信息。 How can I maintain fragment state when added to the back stack?

【讨论】:

  • 我可以给我一些代码吗? :)
  • 我写不出你需要的具体代码。但它很简单,您已经将索引保存在 onResume 方法中。只需等到数据通过适配器加载到列表中即可恢复它,而不是 onResume()。最初,您将拥有值为 0 的索引。只需按照您希望在屏幕第一次显示时加载到特定索引的方式编写它。
  • 其实,当我回到我的listView时,我可以看到列表项中的小图像闪烁一秒钟。这是什么意思吗?
  • 你用什么来加载图片。这意味着它们正在被重绘,但是由于您将它们保存在内存中,因此它们会立即被绘制。试着按照我告诉你的去做。将索引保存在 onPause 上,并在用项目填充 listView 后使用它以滚动到该索引。(第一次启动将为 0,所以无论如何你都可以去)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多