片段内的按钮,刷新/重新加载所有片段

时间:2015-01-08 16:14:11

标签: android android-fragments

这是在扼杀我。我有一个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?
                    }
                });
}

因此,在此代码中,更具体地说,在按钮单击中,我需要做什么来强制所有片段重新加载和检索最新数据。

我已经找到了答案,但我确定如何将它与此联系起来。

感谢。

3 个答案:

答案 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)中更新片段列表。在需要时从片段调用父方法。