看起来刷新问题以前已经讨论过,但是没有一个解决方案对我奏效。
我的目标: 我正在使用FragmentStatePagerAdapter。适配器的每个位置都包含一个具有象棋格子外观的线性布局,其中每个单元格由CheckedTextView表示。
此外,我希望设置一个监听器用于监听单元格的点击事件,并删除先前选择的单元格并进行新选择。
已完成的工作: 每个片段都已正确加载,并显示出所有数据/默认状态(在列表中加载片段时计算)。
当我单击一个单元格时,保存的单元格列表中的所有状态都被正确获取,同时我还可以在调试代码时查看状态更改。同时,我为表示单元格的CheckedTextView分配了一个新状态,如下所示:
CheckedTextView cellView = (CheckedTextView) GridRow.getChildAt(c);
cellView.setSelected(false);
cellView.setChecked(false);
cellView.setTag(cellsChess.get(i).get(c));
问题:
尽管数值被正确地存储和分配,但视图不能被刷新,视图中的单元格数值没有得到更新。
我尝试过但没用的技巧:
1. 调用adapter.notifyDataSetChanged:
只有在我们重写了FragmentStatePagerAdapter时才能在使用时调用。@Override
public int getItemPosition(Object object){
return POSITION_NONE;
}
2. 添加覆盖DestroyItem方法并将片段添加到getItem的Map上:
这不适合我正在使用FragmentStatePagerAdapter,因此使用此pagerAdapter的整个目的将会消失。
3. 调用invalidate: 在此情况下不适用,我需要实时刷新。
4. 在instantiateItem()中使用setTag()方法: 我认为在这种情况下不适用。
参考线程: 在恢复活动时刷新FragmentStatePagerAdapter上的图像
notifyDataSetChanged无法更新ListView
我已尽力清晰地表述了我的问题,如果有人需要更多澄清,请询问。
高度赞赏紧急回复,
干杯
****更新*****
我正在使用ViewPagerIndicator,而不是默认的ViewPager。
FragmentAdapter
中的Fragment
通常是自包含的 - 除非Fragment
在其自身上更改视图,否则您无法做太多事情,除非使用像WeakReference
Map
和findViewByTag
这样的黑客技巧。如果您需要从Activity
中执行此操作并且不喜欢使用黑客技巧,您需要建立自己的Activity
->Fragment
通信方式,而不依赖于Activity
能够获取对Fragment
的引用(例如广播,Guava的事件总线 - 或者Otto - 或Ambassador等)。就个人而言,我选择了WeakReference Map - 它比清晰的方法简单得多。 - DelyanGridView
组合或者GridRow
只是像LinearLayout
这样的布局?如果是GridView
,请考虑更新数据并调用myGridAdapter.notifyDataSetChanged();
,但我猜你没有使用GridView
。在这种情况下,请尝试调用GridRow.requestLayout();
如果你正在从Fragment
的代码中更新Fragment
的GUI,则不应该需要所有这些,可能有其他问题。尝试制作一个pager、一个cell fragment并分享你的代码。 - M-Wajeeh