gpt4 book ai didi

android - 如何以编程方式通过 Main Activity 在 ViewPager 中更新刷新 fragment

转载 作者:IT老高 更新时间:2023-10-28 23:08:49 29 4
gpt4 key购买 nike

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

问题是我不明白如何以编程方式更新 fragment 以使用新的 fragment 更改更新 ViewPager

例如,当我从主调用 setFragment(int interval, Point[] snodePoint) 时,我有这个显示图表的 Fragment(在我的 Intent 中),图表应在 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-根据主activity接收到的数据创建一个fragment。
  • 2-每次在主要 Activity 发生时更改 fragment 的数据类似于 setFragment(...) 的新数据(始终由主生成)。

我该怎么做?

带有 FragmentAdapter 的主要 Activity

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) {
}

}

}

我第一次创建 fragment 时,主要 Activity 通过覆盖的 getItem(int position) 成功将参数传递给 fragment ,但是如果我尝试更改数据,如果我尝试在适配器 mMyFragmentAdapter 上调用 notifyDataSetChanged(),没有任何反应,并且 ViewPager 中的 fragment 继续使用创建时传递的相同数据。

编辑

在其他关于 fragment 更新的问题中看到一些部分代码后,我也尝试过这个

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();
}

}

假设0是第一个Fragment-Tab fragment 的id(我不确定这种操作),但是fragment.updateDisplay();没有被调用。

最佳答案

在您的适配器中覆盖 getItemPosition

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

之后

viewPager.getAdapter().notifyDataSetChanged() 

应该可以。

关于android - 如何以编程方式通过 Main Activity 在 ViewPager 中更新刷新 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744261/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com