6

似乎之前讨论过刷新问题,但没有解决方案为我工作。使用FragmentStatePagerAdapter时刷新片段视图

我在做什么: 我正在使用FragmentStatePagerAdapter。适配器的每个位置都包含一个具有线性布局的片段,该布局具有象棋般的外观,每个单元由一个CheckedTextView表示。

还有一个应监听点击并删除单元格上的先前选择并进行新选择的侦听器。

请告诉我工作: 每个片段的所有数据/默认状态(而片段在列表加载计算)

正确加载当我点击从保存的细胞列表中的所有状态的细胞被正确提取,我可以在调试时看到代码中的状态改变。同时,我为CheckedTextView分配了一个代表单元格的新状态。这是设置,如:

的问题: 即使值存储和分配正确的观点不能被刷新,没有更新的视图中的单元格的值。

提示我已经试过未工作: 1.呼叫adapter.notifyDataSetChanged: 可谓是同时使用FragmentStatePagerAdapter只有当我们已经覆盖:

@Override 
    public int getItemPosition(Object object){ 
     return POSITION_NONE; 
    } 

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

这是不合适的,因为我正在处理FragmentStatePagerAdapter,所以使用这个pagerAdapter的全部目的将会消失。

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

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

参考线: Refresh images on FragmentStatePagerAdapter on resuming activity

ViewPager PagerAdapter not updating the View

Update ViewPager dynamically?

notifyDataSetChanged fails to update ListView

我试图说明我的问题尽可能讲清楚,如果有人需要更多的澄清,不要问。

紧急答复将高度赞赏,

干杯

****更新*****

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

+0

在你的设置中,每个片段代表什么?它一次只能在屏幕上显示一个片段吗?你添加的代码在哪里?它在片段类中吗?最后,什么是GridRow? – 2013-03-04 09:48:22

+0

嗨谢里夫,每个片段代表一个国际象棋棋盘。我有一个调用容器片段的活动,这个containerFragment有一个viewpager,它具有FragmentStatePagerAadaper集合。每个适配器项目都是一个片段,并且在onCreatView的这个片段中,每个棋子视图都被初始化。此外,单元的监听器位于同一个片段中,我检查当前状态和新状态并相应地更改状态。 GridRow只是一行代表单元格的checkedTextview。我希望这回答你所有的问题,任何提示....? – AliR 2013-03-05 00:35:07

+0

事实上,一切都发生在你的片段内意味着所有这些麻烦都不需要。你确定你的选择器(背景)是正确的吗?你可以显示它和你的XML每个单元格。通常情况下,当您试图更新viewpager中的特定片段时,视图不会更新。 – 2013-03-05 08:59:55

回答

0

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

当我用我的ArrayAdapter的子类来更新ListView时,它的工作是笔直的。当我调用notifyDataSetChanged()时,ListView项目被更新。

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

令我惊讶的是,DataSetObserver不是一个接口,而是一个抽象类。所以我不能简单地在我的子类的片段中实现它。我必须定义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(); 
} 
} 

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

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

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

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