【问题标题】:Update ViewPager's Fragments from another class:从另一个类更新 ViewPager 的片段:
【发布时间】:2013-05-28 14:07:08
【问题描述】:

以下问题:

How to recreate all fragments in ViewPager:

我有这些课程:

public class ViewPagerAdapter extends FragmentPagerAdapter 
{
private List<Fragment> fragments;

/**
 * @param fm
 * @param fragments
 */
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    this.fragments = fragments;
}

/* (non-Javadoc)
 * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
 */

@Override
public Fragment getItem(int position) {
    return this.fragments.get(position);
}

/* (non-Javadoc)
 * @see android.support.v4.view.PagerAdapter#getCount()
 */

@Override
public int getCount() {
    return this.fragments.size();
}

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

还有一个FragmentActivity

 public class TabsViewPagerFragmentActivity extends FragmentActivity implements  
 ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener 
 {
    static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName();
    private TabHost mTabHost;
    private ViewPager mViewPager;
    private HashMap<String, TabInfo> mapTabInfo = new HashMap<String,      TabsViewPagerFragmentActivity.TabInfo>();
    public ViewPagerAdapter mPagerAdapter;
    .....

现在在这个FragmentActivity 我有这个听众:

  private class SlicerSelectedOnClickListener implements OnClickListener 
{
    private ODSharedSlicer slicer;
    private int slicerIndex;

    public SlicerSelectedOnClickListener(ODSharedSlicer slicer, int slicerIntex)
    {
        super();
        this.slicer = slicer;
        this.slicerIndex = slicerIntex;
    }

    public void onClick(View v) 
    {
        slicerOnClickConfiguration(slicerIndex, v);
        mPagerAdapter.notifyDataSetChanged();
    }
}
    ....

这很好用 notifyDataSetChanged() 正在被调用,并且 ViewPager 的片段正在按照我的意愿重新创建。

问题:当我尝试从另一个类调用适配器的notifyDataSetChanged() 方法时(在我的情况下,它是一个负责解析从服务器接收到的数据的类)片段保持不变。

我尝试这样做:我在 FragmentActivity 类中创建了这些方法(带有 ViewPager 的类):

 public void NotifyTabActivityViewPagerAdapter()
{
    mPagerAdapter.notifyDataSetChanged();
}

public ViewPagerAdapter getTabActivityViewPagerAdapter()
{
    return mPagerAdapter;
}

public ViewPager getTabActivityViewPager()
{
    return mViewPager;
}

并从第二节课尝试了以下内容:

((TabsViewPagerFragmentActivity)currentActivity).NotifyTabActivityViewPagerAdapter();

或者:

((TabsViewPagerFragmentActivity)currentActivity).getTabActivityViewPager().setAdapter(((TabsViewPagerFragmentActivity)currentActivity).getTabActivityViewPagerAdapter());

但这些都不起作用。奇怪的是,当我运行它时:

((TabsViewPagerFragmentActivity)currentActivity).getTabActivityViewPager().setAdapter(null);

片段确实被删除了,但我无法使用从服务器端接收到的新数据重新创建新的片段集。

我在这里缺少什么?我应该如何从另一个类重新创建这个 FragmentActivity 中的所有片段?

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-fragments android-viewpager notifydatasetchanged


    【解决方案1】:

    我认为情况并非如此,我认为您应该确保 NotifyTabActivityViewPagerAdapter 在 onPostExecute 运行,但我有一个项目 notifyDataSetChange 不起作用,片段仍然是空的。 为了解决这个问题,我重写了适配器中的 getItemPosition,如下所示:

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

    通过返回POSITION_NONE,您可以确保适配器刷新其所有数据。

    【讨论】:

    【解决方案2】:

    里面真的有 7 个问题。但我理解主要问题是更新或发送数据到与来自其他类的ViewPager 关联的FragmentActivity。我不知道其他类与FragmentActivityViewPager 的关系,但我知道有两种方法可以按照您想要的方式处理更新或传输信息

    (1) 一个interface

    如果您引用的类是另一个 Fragment 并加载到同一个 ViewPager 中,那么您在另一个 FragmentFragmentActivity 中更新数据(或调用方法)的方式是使用接口.您可以滚动到该链接的底部以获取一些示例代码,但基本上您在Fragment 和包含ViewPager 的活动(即片段的主机活动)之间建立了一座桥梁。然后,您创建一个“侦听器”来查找Fragment 中的某些更改,然后它将一些信息传递给 hoast 活动。然后宿主活动在您需要更新的第二个Fragment 中调用公共方法。这里唯一棘手的部分是记住在FragmentonAttach 方法中初始化您的接口“侦听器”,否则它将不起作用。

    (2) 意图

    如果您要处理两个单独的活动,只需使用Intent。将意图传递给您正在寻找的FragmentActivity 并覆盖onNewIntent(Intent i) 以在接收类中执行您想要的任何功能。

    希望有所帮助 - 我需要更具体的回答,因为那里有很多子问题。

    【讨论】:

    • 其实这第二个类是一个辅助类,并没有扩展Fragment或Activity。这里只有一个问题:“我应该如何从另一个类重新创建这个 FragmentActivity 中的所有片段?”流程是这样的:我的 FragmentActivity 中有一个自定义视图,自定义视图会弹出一个弹出窗口,从该弹出窗口中选择一个选项会启动一个从服务器获取数据的 AsyncTask,接下来我有一个辅助类(一个简单的类)解析这些数据,当它完成时我想运行 .notifyDataSetChanged();从这个类或其他方式,就像我在监听器中所做的那样。
    • 好吧,我以前不明白。如果您的班级只是实现AsyncTack,为什么不能在该班级与其onPostExecute 方法之间设置一个回调?
    • 因为在 onPostExecute 中我调用了一个方法“ResponseHandler.ParseRecievedData(String data)”,其中“ResponseHandler”是一个简单的 java 类,我在其中存储了处理 AsyncTask Web 请求的所有方法。我想保持这种分离。但我无法理解如何从“ResponseHandler”类调用 NotifyDataSetChanged()。它是否必须与 Activity/Application 上下文有关?
    • 只需在您的onPostExecute 中添加另一个方法,该方法会在您的响应被解析后调用它。是的,它与上下文有关 - see this post 在从单独的类运行 AsncTask 时如何使用上下文
    • 调用 NotifyDataSetChanged 确实可以在 onPostExecute 中工作,但由于某种原因,不是来自我将活动传递给的助手类。奇怪的。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多