使用FragmentStatePagerAdapter时刷新片段视图

Ali*_*liR 7 android checkedtextview android-fragments android-viewpager fragmentstatepageradapter

似乎之前讨论过刷新问题,但没有一个解决方案适合我.

我想做的是: 我正在使用FragmentStatePagerAdapter.适配器的每个位置都包含一个片段,该片段具有象棋状态的线性布局,每个单元格由CheckedTextView表示.

并且应该侦听单击并且删除单元格上的先前选择并进行新选择的侦听器.

什么工作: 每个片段都正确加载所有数据/默认状态(在片段加载到列表时计算)

当我单击一个单元格时,保存的单元格列表中的所有状态都被正确获取,我可以在调试时更改代码中的状态更改.同时我为CheckedTextView指定一个表示单元格的新状态.设置如下:

CheckedTextView cellView = (CheckedTextView) GridRow.getChildAt(c);
                                cellView.setSelected(false);
                                cellView.setChecked(false);
                                cellView.setTag(cellsChess.get(i).get(c));
Run Code Online (Sandbox Code Playgroud)

问题: 即使正确存储和分配了值,也无法刷新视图,视图中单元格的值不会更新.

我试过的提示没有用: 1.调用adapter.notifyDataSetChanged: 只有当我们被覆盖时才可以在使用FragmentStatePagerAdapter时调用:

@Override
    public int getItemPosition(Object object){
        return POSITION_NONE;
    }
Run Code Online (Sandbox Code Playgroud)

2.为DestroyItem添加Overriden方法,并将片段添加到getItem上的Map:

这不适合我正在使用FragmentStatePagerAdapter,因此使用此pagerAdapter的整个目的都将消失.

3.调用invalidate: 这不适合这种情况,我需要实时刷新.

4. instantiateItem()中的setTag()方法: 我不认为这种情况适合.

引用的线程: 在恢复活动时刷新FragmentStatePagerAdapter上的图像

ViewPager PagerAdapter未更新视图

动态更新ViewPager?

notifyDataSetChanged无法更新ListView

我试图尽可能清楚地说明我的问题,如果有人需要更多澄清,请问.

紧急回复将受到高度赞赏,

干杯

****更新*****

我使用的是ViewPagerIndicator,而不是默认的ViewPager.

gm2*_*008 0

关于notifyDataSetChanged()函数,我有两种不同的经历。

当我使用ArrayAdapter的子类来更新 ListView 时,它可以正常工作。当我调用notifyDataSetChanged()时,ListView项目被更新。

但是,当我使用FragmentStatePagerAdapter的子类来更新 ViewPager 时,调用 notificationDataSetChanged() 不起作用。NotifyDataSetChanged() 负责调用所有注册的DataSetObserver的 onChanged() 函数,但观察者并没有像 ArrayAdapter 那样自动注册。你必须自己做基础工作。

令我惊讶的是,DataSetObserver 不是一个接口,而是一个抽象类。所以我不能简单地在我的片段子类中实现它。我必须定义 DataSetObserver 的子类,然后在此类中定义一个成员字段作为对我的片段的引用,并在重写的 onChanged() 函数中更新您的视图显示。代码如下:

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();
}
}
Run Code Online (Sandbox Code Playgroud)

你必须要小心。您需要记住在重写的fragment.onDestroy()中取消引用并取消注册DataSetObserver对象,否则片段无法被垃圾收集。

后来通过查看源码,发现ArrayAdapter和FragmentStatePagerAdapter并不是兄弟姐妹。他们是完全不同的。它们实际上来自不同的包:

  android.widget.ArrayAdapter
  android.support.v4.app.FragmentStatePagerAdapter
Run Code Online (Sandbox Code Playgroud)

这就是为什么前者很容易工作而后者则不然。