这是在扼杀我。我有一个DemoFragment,它创建了3个实例。在这些实例中,将不同的数据加载到片段中。我想要做的是有一个按钮(在片段内)强制所有片段刷新或重新加载。这是必要的,因为按钮还提交了需要为每个片段重新拉出的新数据。
我已经搜索了大量的解决方案,但无法深入了解它。目前我有一个活动,片段和适配器。下面是删节代码(正如预期的那样加载3页):
活动(RoutineDetailsActivity.java)
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
public class RoutineDetailsActivity extends FragmentActivity {
ViewPager mViewPager;
Button mLogout;
CustomPagerAdapter mSectionsPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_routine_details);
mSectionsPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
}
}
适配器(CustomPagerAdapter.java)
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import java.util.Locale;
public class CustomPagerAdapter extends FragmentStatePagerAdapter {
public CustomPagerAdapter (FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 3;
}
@Override
public Fragment getItem(int position) {
return DemoFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
}
片段(DemoFragment.java)
public class DemoFragment extends Fragment {
int mNum;
static DemoFragment newInstance(int num) {
DemoFragment f = new DemoFragment();
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNum = getArguments() != null ? getArguments().getInt("num") : 1;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_routine_details, container, false);
}
@Override
public void onResume() {
// CODE CLIPPED, do loads of sh*t
Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// New data uploaded to server
// What code to force reload the fragments?
}
});
}
因此,在此代码中,更具体地说,在按钮单击中,我需要做什么来强制所有片段重新加载和检索最新数据。
我已经找到了答案,但我确定如何将它与此联系起来。
感谢。
答案 0 :(得分:2)
如果您愿意添加一个名为EventBus的小型库:https://github.com/greenrobot/EventBus
你可以这样做:
public class AnyFragment extends Fragment {
@Override
public void onAttach(final Activity activity) {
super.onAttach(activity);
EventBus.getDefault().register(this);
}
@Override
public void onDetach() {
EventBus.getDefault().unregister(this);
super.onDetach();
}
public void onEventMainThread(UpdateUIEvent ev) {
// perform refresh
}
}
在我的情况下,UpdateUIEvent只是一个简单的空对象,但也可以包含任意数据:
public class UpdateUIEvent {}
有了这个,您可以通过执行以下操作从代码中的任何位置刷新AnyFragment:
EventBus.getDefault().post(new UpdateUIEvent());
我想强调你可以做到任何地方,但在你的情况下,上面一行是你点击按钮时唯一要做的事情。然后,如AnyFragment
所示,所有片段的监听都会收到事件:)
答案 1 :(得分:0)
在片段中实现一个接口IRefresher
。跟踪活动中3个片段的引用。单击按钮时,调用接口方法refreshMe()
,它将作为片段中的侦听器/回调函数,并在该方法中刷新片段。
我已经在我的一个项目中完成了它并且它完美地运行
答案 2 :(得分:0)
我不确定我是否理解了你的问题。从您的按钮触发器,您可以调用父活动,其中包含所有片段。在父活动中创建方法。在方法寄存器监听器(Call Interface method)中更新片段列表。在需要时从片段调用父方法。