8

似乎之前讨论过刷新问题,但没有一个解决方案对我有用。

我正在尝试做的事情: 我正在使用 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. instanceiteItem() 中的 setTag() 方法: 我认为这在这种情况下不合适。

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

ViewPager PagerAdapter 不更新视图

动态更新 ViewPager?

notifyDataSetChanged 无法更新 ListView

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

紧急回复将不胜感激,

干杯

****更新*****

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

4

1 回答 1

0

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

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

但是,当我使用FragmentStatePagerAdapter的子类更新 ViewPager 时,调用 notifyDataSetChanged() 不起作用。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();
}
}

你必须要小心。您需要记住在覆盖的 fragment.onDestroy() 中取消引用并取消注册 DataSetObserver 对象,否则无法对 Fragment 进行垃圾收集。

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

  android.widget.ArrayAdapter
  android.support.v4.app.FragmentStatePagerAdapter

这就是为什么前者很容易工作,而后者却没有。

于 2013-06-03T17:08:48.507 回答