【问题标题】:Refreshing Fragment View while using FragmentStatePagerAdapter使用 FragmentStatePagerAdapter 时刷新片段视图
【发布时间】:2013-02-14 01:32:09
【问题描述】:

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

我想要做什么: 我正在使用 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.调用无效: 这不适合这种情况,我需要实时刷新。

4. instanceiteItem() 中的 setTag() 方法: 我认为这在这种情况下是不合适的。

引用的线程: Refresh images on FragmentStatePagerAdapter on resuming activity

ViewPager PagerAdapter not updating the View

Update ViewPager dynamically?

notifyDataSetChanged fails to update ListView

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

我们将不胜感激紧急回复,

干杯

****更新*****

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

【问题讨论】:

  • 在您的设置中,每个片段代表什么?一次只在屏幕上显示一个片段吗?你添加的代码在哪里?它在片段类中吗?最后,什么是 GridRow?
  • 嗨,Sherif,每个片段代表一个棋盘。我有一个调用容器片段的活动,这个 containerFragment 有一个 viewpager,它设置了 FragmentStatePagerAadaper。每个适配器项都是一个片段,并且在其 onCreatView 的这个片段中,每个国际象棋视图都被初始化。此外,单元格的侦听器位于同一片段中,我在其中检查当前状态和新状态并相应地更改状态。 GridRow 只是代表一个单元格的checkedTextview 行。我希望这能回答你所有的问题,任何提示......?
  • 一切都发生在你的片段中的事实意味着不需要所有这些麻烦。你确定你的选择器(背景)是正确的吗?你可以为每个单元格显示它和你的 xml。通常,当您尝试更新 viewpager 中的特定片段时,会发生视图未更新的情况。
  • 所有片段的选择功能都相同(没有具体说明)。而且我也不想从视图寻呼机更新任何东西,它全部在片段中。抱歉,保密协议不允许我共享代码。简而言之,我如何更新片段侦听器中的视图。谢谢
  • FragmentAdapters 中的Fragments 通常是自包含的 - 除非Fragment 自行更改其视图,否则如果没有像@987654330 这样的黑客,你真的无能为力@MapfindViewByTag。如果您需要从Activity 进行操作并且厌恶黑客攻击,您需要建立自己的方式来进行Activity -> Fragment 通信,而不依赖于Activity 能够获得参考到Fragment(例如,广播、Guava's - 或 Otto - 或大使等活动巴士等)。就个人而言,我选择 WeakReference Map - 它比干净的方式简单得多。

标签: android android-fragments android-viewpager checkedtextview fragmentstatepageradapter


【解决方案1】:

关于 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

这就是为什么前者容易工作,而后者却不行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多