从同一个片段中重启片段

时间:2018-01-21 12:20:15

标签: android android-fragments

我有一个标签布局,其中ViewPager有3个片段。这些片段中的数据由recyclerview填充。我还实现了滑动以刷新此片段中的布局。

当我拉动刷新'PostTab'时,我想重新启动/重新加载片段,以便从服务器获取新的数据集。我无法这样做。

我知道围绕这个主题有很多答案,但我想这是有太多信息的情况,因此在尝试了许多不同的事情之后我无法做到。

MainActivity 文件包含FragmentPagerAdapter以制作片段

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    private SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        switch (position){
            case 0:
                return new CategoryTab();

            case 1:
                return new PostTab();

            case 2:
                return new VideoTab();
            default:
                return null;
        }

    }

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

    @Override
    public CharSequence getPageTitle ( int position){
        switch (position) {
            case 0:
                return "Tab1 Working";
            case 1:
                return "Tab2 Working";
            case 2:
                return "Tab3 Working";
        }
        return null;
    }
}

刷新布局存在于PostTab片段

PostTab.java

public class PostTab extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater,  ViewGroup container,  Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.post_tab, container, false);


    // Get data from server

    //set recycler adapter 

    //Scroll listener to load more data

    //Load more data on scroll

    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refreshItems();
        }
    });
    return view;
}

public void refreshItems(){
    final android.support.v4.app.FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
            fragmentTransaction.detach(this);
            fragmentTransaction.attach(this);
            fragmentTransaction.commit();
    }

}

}

上面的代码正确加载了新数据,但随后我的应用程序崩溃了。我的猜测是,这段代码没有通过再次调用onCreateView方法完全重启片段。

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder

如果我将代码更改为下面,则片段变为空白(以前加载的数据也会消失)。

fragmentTransaction.remove(this);
fragmentTransaction.attact(this);

我如何使用删除&加?由于我之前没有设置标签,因此我的应用程序崩溃了我在此处设置的任何标签。

fragmentTransaction.remove(this);
fragmentTransaction.add(this,"Tag");

可以'替换'有帮助吗?根据我的理解,它将取代所有碎片。我只需要重新加载3个片段中的1个。

我尝试按this回答,但我不知道碎片标记,因为我没有设置它。

1 个答案:

答案 0 :(得分:0)

我认为您应该只需要通过refreshItems()方法内的notify方法更新适配器,例如public void refreshItems(){ youradapter.notifydatasetchanged(); }。这可能是在您调用另一个片段并设置适配器时引起的,或者您可能正在更改已更改的位置。