【问题标题】:Restart fragment from within the same fragment从同一片段中重新启动片段
【发布时间】:2018-01-21 12:20:14
【问题描述】:

我有一个带有 3 个片段的 ViewPager 的选项卡布局。这些片段中的数据由 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 的回答,但我不知道片段标签,因为我没有设置它。

【问题讨论】:

  • 而不是重新加载片段为什么不只是使当前适配器数据无效并再次加载它
  • @VivekMishra 嘿,我复制了异步任务以在刷新项方法中从服务器获取初始数据,并重置滚动侦听器以重置其内部受分页加载异步任务影响的不同参数它。到目前为止,它似乎正在工作。测试类中存在的各种函数以检查是否有任何问题。感谢您的评论,这让我重新思考了这种方法。仍然想知道我在上述方法中做错了什么。
  • 创建一个方法来设置你的适配器。并在该方法中传递您的数据数组或列出您拥有的任何内容以及您的视图(如 listview 或 recyclerview),并在您想通过将新数据集传递给该方法来显示更新的记录时调用该方法。如果有,请记住使以前的数据无效

标签: android android-fragments


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多