如何通过主要活动以编程方式更新ViewPager中的片段 [英] How to update-refresh Fragment in ViewPager by Main Activity programmatically

查看:43
本文介绍了如何通过主要活动以编程方式更新ViewPager中的片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个使用Fragment和一个MainActivity的应用程序,该应用程序在同一ViewPager中显示不同的片段来复制典型MVC应用程序的行为.

I'm building an App that use Fragment and a single MainActivity that showing different fragments in the same ViewPager to replicate the behaviour of a typical MVC application.

问题是还不了解如何以编程方式更新片段以使用新的片段更改来更新ViewPager

The problem is that haven't understood how could I update the fragment programmatically to update the ViewPager with the new Fragment changes

例如,我有这个Fragment,它显示一个图表(出于我的意图),当我从主菜单调用setFragment(int interval, Point[] snodePoint)时,应该在ViewPager

For example I have this Fragment that show a chart, (in my intention) when I invoke setFragment(int interval, Point[] snodePoint) from the main, the chart should be updated in ViewPager

public class LineFragment extends Fragment {
    static int interval;
    static Point snodePoints[];


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.fragment_linegraph, container,
                false);
        Bundle bundle = this.getArguments();
        ChartConfig cg = bundle.getParcelable("FragmentData");

        snodePoints = cg.getPoints();
        interval= cg.getInterval();
        Line l = new Line();

        for(int i=0; i<snodePoints.length; i++){
          LinePoint p = new LinePoint();
          Point sp=snodePoints[i];
          p.setX(sp.getX());
          p.setY(sp.getY());
          l.addPoint(p)
        }
        l.setColor(getResources().getColor(R.color.green));

        LineGraph li = (LineGraph) v.findViewById(R.id.linegraph);
        li.addLine(l);
        li.setRangeY(0, interval);
        li.setLineToFill(0);

        li.setOnPointClickedListener(new OnPointClickedListener() {

            @Override
            public void onClick(int lineIndex, int pointIndex) {
                // TODO Auto-generated method stub

            }

        });

        return v;
    }
}

我需要用几句话

  • 1-根据主要活动接收到的数据创建一个片段.
  • 2-在主要活动中每次发生时都更改片段的数据 类似于setFragment(...),其中包含新数据(始终由主体生成).
  • 1-create a fragment based on the data received by the main activity.
  • 2-change the data of the fragment everytime in the main activity happens something like setFragment(...) with new data (generated always by the main).

我该怎么办?

带有FragmentAdapter的主要活动

The Main Activity with the FragmentAdapter

public class MainActivity extends FragmentActivity {

ViewPager mViewPager;
MyFragmentAdapter mMyFragmentAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mViewPager = (ViewPager) findViewById(R.id.view_pager);
    final ActionBar bar = this.getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    LineFragment lineFrag = new LineFragment();
    BarFragment barFrag = new BarFragment();
    PieFragment pieFrag = new PieFragment();

    mMyFragmentAdapter = new MyFragmentAdapter(this, mViewPager);
    mMyFragmentAdapter.addTab(bar.newTab().setText("Line"), LineFragment.class,
            null, lineFrag);
    mMyFragmentAdapter.addTab(bar.newTab().setText("Bar"), BarFragment.class,
            null, barFrag);
    mMyFragmentAdapter.addTab(bar.newTab().setText("Pie"), PieFragment.class,
            null, pieFrag);
    mViewPager.setOffscreenPageLimit(mMyFragmentAdapter.getCount() - 1);
}

public static class MyFragmentAdapter extends FragmentStatePagerAdapter implements
        ActionBar.TabListener, ViewPager.OnPageChangeListener {

    private final MainActivity mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private final ArrayList<Fragment> mFrag = new ArrayList<Fragment>();

    static final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    public MyFragmentAdapter(MainActivity activity, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActionBar = activity.getActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args,
            Fragment frag) {
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mFrag.add(frag);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

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

    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        Bundle args = new Bundle();
        ChartConfig cg = new ChartConfig(interval, snodePoint);
        args.putParcelable("FragmentData", cg);
        Fragment f = mFrag.get(position);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);

    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        Object tag = tab.getTag();
        for (int i = 0; i < mTabs.size(); i++) {
            if (mTabs.get(i) == tag) {
                mViewPager.setCurrentItem(i);
            }
        }
    }

    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
    }

}

}

第一次创建片段时,主活动通过覆盖的getItem(int position)将参数成功传递给Fragment,但是如果我尝试更改数据,也尝试在适配器上调用notifyDataSetChanged() mMyFragmentAdapter,什么也没有发生,并且ViewPager中的片段继续使用创建时传递的相同数据.

The first time that I create the fragment, the main activity pass successful the parameters to the Fragment through the overrided getItem(int position), but if I try to change the data, also if I try to invoke notifyDataSetChanged() on the adapter mMyFragmentAdapter, nothing happens and the fragments in ViewPager continue to use the same data passed in creation.

编辑

在其他有关片段更新的问题中看到一些部分代码之后,我也尝试过

Following some partial code seen in other question about fragment update I have also tried this

public void update() {
        try{
            LineFragment fragment = 
                      (LineFragment) getSupportFragmentManager().findFragmentByTag(
                                   "android:switcher:"+R.id.view_pager+":0");
                  if(fragment != null)
                  {
                     if(fragment.getView() != null) 
                     {

                        fragment.updateDisplay();
                     }
                  }
        }
        catch(RuntimeException e){
            e.printStackTrace();
        }

    }

假定第一个Fragment-Tab片段的ID为0(我不确定这种操作),但是不会调用fragment.updateDisplay();.

Assuming that 0 is the id of the first Fragment-Tab fragment(I'm not sure about this kind of operation), but fragment.updateDisplay(); is not invoked.

推荐答案

在适配器中重写getItemPosition

In your Adapter override getItemPosition

@Override
public int getItemPosition(Object object) {
    // POSITION_NONE makes it possible to reload the PagerAdapter
    return POSITION_NONE;
}

之后

viewPager.getAdapter().notifyDataSetChanged() 

应该工作.

这篇关于如何通过主要活动以编程方式更新ViewPager中的片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆