方向更改时列表片段中列表视图行的重复

时间:2012-08-30 19:15:18

标签: android android-listview android-listfragment

我有一个ListFragment,我使用自定义适配器来填充listview。一切顺利,直到我改变方向和滚动。然后它看起来像这样: ListView after a few orientation changes

我猜这与我对视图持有者摸索有关,但我现在无法访问代码。

5 个答案:

答案 0 :(得分:14)

重叠片段的原因是我使用了FrameLayout并使用FragmentTransition.add(...)添加了片段。当我将.add()更改为.replace()时,旧片段被删除,新片段被添加,我的问题解决了。

答案 1 :(得分:2)

我有类似的问题,根据我告诉解决方案: - 你得到这种模糊,因为每次在方向上改变时都会创建listfragment的新实例(可能是在oncreate()中),所以你必须只创建一个列表片段的实例,并且在方向更改时替换该片段而不是再加一次。

答案 2 :(得分:0)

更改方向会导致onCreate重新启动,除非您包含此方法

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
}

并将其放入清单的活动部分

android:configChanges="orientation"

答案 3 :(得分:0)

检查这是第一次调用onCreate(),    换句话说,确定回调是否不是由于屏幕旋转造成的。

protected void onCreate(Bundle savedInstanceState) {
        if(savedInstanceState == null) {
    // transition.add(Your fragment,...)
    }
}

答案 4 :(得分:0)

我有同样的问题,因为FrameLayout的使用, 首先,您必须检查您的片段是否已添加到活动中:

String TagName = "F";
  

添加没有UI的片段如果您想稍后从活动中获取片段,则需要使用findFragmentByTag()。 "谷歌"   http://developer.android.com/guide/components/fragments.html#Adding

Fragement F = getFragmentManager().findFragmentByTag(TagName);

然后检查

if(F == null) {
  F = new F();
  getFragmentManager()
     .beginTransaction()
     .add(R.id.container, F, TagName)
     .commit();
}

此处的目标是避免添加或创建片段的新实例,该实例在配置更改期间持续存在,这会在将FrameLayout用作容器时导致问题。

解决方案2(简单): 你唯一需要做的就是将你的容器改为ex:LinearLayout,就是这样。但在我看来,由于片段的多个实例,这不是最好的解决方案。

希望得到这个帮助;