1

目前我有一个setContentView包含列表片段的布局的活动。基本上它加载一个列表视图。

我的操作栏包含一个微调器,可让我加载不同的列表。我可以在后台加载列表对象,并在用户使用微调器选项切换到这些列表时更新一个片段的适配器。但这不会保留用户滚动到的位置。

我想搞乱加载多个列表片段,当用户选择不同的微调器选项时,会发生片段事务,显示与该特定列表关联的其他列表片段之一。

我将如何做到这一点,以及如何修改我的主机活动?

我见过的例子涉及在宿主活动FragmentTransaction的方法中创建所有片段,而不是在 XML 中创建片段。onCreate现在我在 XML 中有一个片段,需要再创建两个实际上相同的 ListFragments。

洞察力赞赏

4

2 回答 2

2

您看到在 onCreate() 方法中添加片段而不是将它们直接放入 XML 的原因是因为无法删除/修改 XML 中包含的片段。如果一定要有这个fragment,又想加载到其他fragment中,可以在父容器中添加容器(如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();

希望这可以帮助。

于 2014-03-04T20:45:01.653 回答
1

看来您可以从这里以编程方式滚动 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

因此,当你重置你的列表视图时,你可以滚动到用户之前的位置,只保留他们滚动位置的整数记录。

我意识到您也在考虑使用片段解决方案。我知道“替换”方法会导致被替换的片段破坏它的视图(至少这是“支持”片段处理它的方式)。因此,在这种情况下,您仍然会返回到失去滚动状态的列表视图。您可以尝试隐藏/显示片段事务,因为它们可能会保留其视图,从而滚动状态。

如果您确实尝试隐藏/显示,请告诉我结果:) 如果有效,我可以自己使用它。

于 2014-03-04T20:52:23.927 回答