似乎之前讨论过刷新问题,但没有一个解决方案适合我。
我想做什么: 我正在使用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添加Overriden方法,并将片段添加到getItem上的Map:
这不适合我使用FragmentStatePagerAdapter,因此使用此pagerAdapter的整个目的都将消失。
3。调用invalidate: 这不适合这种情况,我需要实时刷新。
4。 instantiateItem()中的setTag()方法: 在这种情况下,我认为这不合适。
参考线程 Refresh images on FragmentStatePagerAdapter on resuming activity
ViewPager PagerAdapter not updating the View
notifyDataSetChanged fails to update ListView
我试图尽可能清楚地说明我的问题,如果有人需要更多澄清,请问。
紧急回复将受到高度赞赏,
干杯
**** *****更新
我使用的是ViewPagerIndicator,而不是默认的ViewPager。
答案 0 :(得分:0)
关于notifyDataSetChanged()函数,我有两种不同的体验。
当我使用ArrayAdapter的子类更新ListView时,它直接工作。当我调用notifyDataSetChanged()时,ListView项目会更新。
但是,当我使用FragmentStatePagerAdapter的子类更新ViewPager时,调用notifyDataSetChanged()不起作用。 NotifyDataSetChanged()负责调用所有已注册的DataSetObserver的onChanged()函数,但观察者没有像ArrayAdapter那样自动注册。你必须自己做好基础工作。
令我惊讶的是,DataSetObserver不是一个接口而是一个抽象类。所以我不能简单地在我的子类fragment中实现它。我必须定义DataSetObserver的子类,然后在此类中定义一个成员字段作为对我的片段的引用,并在重写onChanged()函数中更新您的View显示。代码如下:
public class DetailFragDataSetObserver extends DataSetObserver {
private DetailTextFragment view_instance;
protected static ArrayList<DetailFragDataSetObserver> list = new ArrayList<DetailFragDataSetObserver>();
public DetailFragDataSetObserver(DetailTextFragment f){
view_instance = f;
list.add(this);
}
public DetailTextFragment getView(){
return view_instance;
}
public static DataSetObserver findDataSetObserverFor(DetailTextFragment f){
for ( int i = 0; i<list.size(); i++){
if ( list.get(i).getView() == f)
return list.get(i);
}
return null;
}
public static void release(DataSetObserver observer){
list.remove(observer);
((DetailFragDataSetObserver)observer).view_instance = null;
}
@Override
public void onChanged(){
assert null != view_instance;
view_instance.vUpdateData();
}
}
你必须小心。您需要记住取消引用并取消注册覆盖片段.onDestroy()中的DataSetObserver对象,否则无法对片段进行垃圾回收。
稍后,通过查看源代码,我发现了ArrayAdapter和FragmentStatePagerAdapter并且不是兄弟姐妹。他们是完全不同的。它们实际上来自不同的包:
android.widget.ArrayAdapter
android.support.v4.app.FragmentStatePagerAdapter
这就是前者轻松工作的原因,而后者则不然。