目前,我有一个setContentView
包含listfragment布局的活动。基本上它加载了一个列表视图。
我的操作栏包含一个微调器,可以让我加载到不同的列表中。我可以在后台加载List Objects,并在用户使用spinner选项切换到这些列表时更新一个片段的适配器。但这不会保留用户滚动到的位置。
我想要加载多个listfragments,当用户选择不同的spinner选项时,会发生一个片段事务,显示与该特定列表关联的其他listfragments之一。
我该如何做,以及如何修改我的主机活动?
我看到FragmentTransaction
使用的示例涉及在主机活动的onCreate
方法中创建所有片段,而在XML中没有片段。现在我在XML中有一个片段,需要再创建两个几乎完全相同的ListFragments。
洞察力赞赏
答案 0 :(得分:2)
您看到在onCreate()方法中添加片段而不是直接将它们放入XML中的原因是因为无法删除/修改XML中包含的片段。如果您必须拥有此片段并希望加载其他片段,则可以将容器(如LinearLayout,RelativeLayout等)添加到父容器中,然后通过代码动态设置其属性。一个例子是:
LinearLayout layoutD = new LinearLayout(this);
layoutD.setId(R.id.layoutd);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
layoutD.setLayoutParams(params);
layoutD.setOrientation(LinearLayout.VERTICAL);
parent.addView(layoutD); // parent is a reference to the parent widget in the XML
getSupportFragmentManager.beginTransaction().add(R.id.layoutd, your_fragment_here).addToBackStack(null).commit();
希望这有帮助。
答案 1 :(得分:1)
您似乎可以以编程方式从here滚动ListView:
分别用于直接/平滑滚动:
getListView().setSelection(21);
getListView().smoothScrollToPosition(21);
在ListView的getView方法中,您可以记录最后一个View渲染的位置
@Override
public View getView(int position, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
因此,当您重置列表视图时,您可以滚动到用户所在的上一个位置,只保留其滚动位置的整数记录。
我意识到你也在考虑片段解决方案。我知道“替换”方法会导致被替换的片段破坏它的视图(至少是“支持”片段处理它的方式)。因此,在这种情况下,您仍然返回到丢失其滚动状态的列表视图。您可以尝试隐藏/显示片段事务,因为它们可能会保留其视图,从而滚动状态。
如果您尝试隐藏/显示告诉我结果:)如果它有效,我可以自己使用它。