从ViewPager更新Fragment

63

我有一个带有ViewPagerActivity。我还有一个Dialog,将检索一个包含用户将选择的某些项的列表。现在,我应该如何更新Fragment,以便于这个Fragment附加新视图来显示这些项?

这是我的ViewPager适配器:

public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 1;
    }

    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new Fragment1();

        default:
            return null;
        }
    }
}

现在,这里是Fragment

public class Fragment1 extends Fragment{

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

@Override
public ViewGroup onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    ViewGroup view = (ViewGroup)inflater.inflate(R.layout.screen1, container, false);
    }
    return view;
}

}

这是我想用来向我的Fragment中添加项目的方法。

private void addItem() {

    // Instantiate a new "row" view.

    final ViewGroup[] newViews = new ViewGroup[selectedItems.length];


    for(int i = 0; i < selectedItems.length; i++){
        newViews[i] = (ViewGroup) LayoutInflater.from(this).inflate(
                    R.layout.animated_layout_item, mContainerView, false);

        // Set the text in each new row.
        ((TextView) newViews[i].findViewById(android.R.id.text1)).setText(selectedItems[i]);

        // Because mContainerView has android:animateLayoutChanges set to true,
        // adding this view is automatically animated.

            mContainerView.addView(newViews[i], 0);


        // Set a click listener for the "X" button in the row that will remove the row.
        OnClickListener listener = new MyAddItemListener(newViews[i], mContainerView, this);
        newViews[i].findViewById(R.id.delete_button).setOnClickListener(listener);

    }


}

在Fragment1的onCreateView方法中,为什么要写"ViewGroup view = view = "? - MiStr
这是个打错字,请让我来更正。谢谢你注意到了它。 - Luis Lavieri
https://github.com/pchauhan/RefreshFragementViewPager - Parag Chauhan
15个回答

2
很多回答,但是对我来说,一个快速且简单的解决方案就是在MainActivity中编写一个初始化pagerAdapter的方法:
public void initPagerAdapter(){
        pagerAdapter = new MainPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(pagerAdapter);
        tabLayout.setupWithViewPager(viewPager);
}

在我需要刷新的片段中,我只需获取MainActivity并调用该方法:
MainActivity activity = (MainActivity) getContext();
activity.initPagerAdapter();

1
也许你添加片段项目的方法应该是公共的(放置在所需的片段中),并且应该有与selectedItems相同类型的参数..这将使它从活动中可见,活动将具有selectedItems数组,然后就完成了。
附言:最好将其命名为addItemsFromArray(typeOfSelectedItems[] pSelectedItems),因为addItem()名称不太具有描述性。
编辑:stackoverflow刚刚建议了类似的主题:) 点击此处查看详细的想法实现.. :)

0
这对我有用:
活动:
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    if (fragment.isVisible() && fragment instanceof MyFragment) {
        ((MyFragment) fragment).refreshContent();
        break;
    }
}

代码片段:

public void refreshContent() {
    //refresh content
}

0
因为以上答案都没有解决我的问题,这是我的解决方案:
我将POSITION_NONE与在setUserVisibleHint(boolean isVisibleToUser)上加载相结合,而不是在onStart()上加载。
如此所见:https://dev59.com/9Gkw5IYBdhLWcg3wMHkY#25676323Fragment中:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // load data here
    }else{
       // fragment is no longer visible
    }
}

在编程中,FragmentStatePagerAdapter如同Simon Dorociak在这里提供的顶尖答案https://dev59.com/zmMl5IYBdhLWcg3w1p26#18088509所看到的那样:
@Override
public int getItemPosition(@NonNull Object object) {
    return POSITION_NONE;
}

现在,每当片段显示给用户时,它们都会重新加载数据到它们的视图中。


0

1)在您想要更新的片段中创建一个处理程序。

public static Handler sUpdateHandler;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        sUpdateHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                // call you update method here.
            }
        };
    }

2) 在 Activity/Fragment/Dialog 中,无论您想要触发更新调用的位置,在那个处理程序中获取引用并发送消息(告诉您的 Fragment 进行更新)

// Check if the fragment is visible by checking if the handler is null or not.
Handler handler = TaskTabCompletedFragment.sUpdateHandler;
if (handler != null) {
    handler.obtainMessage().sendToTarget();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接