从同一片段中重新启动片段



我有一个选项卡布局,其中ViewPager有3个片段。这些片段中的数据由回收器视图填充。我还在此片段中实现了滑动以刷新布局。

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

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

主活动 文件包含片段页r适配器,以制作片段

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 片段中

邮政选项卡.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");

"替换"会有所帮助吗?根据我的理解,它将替换所有片段。我只需要重新加载 1 个片段中的 3 个。

我试图遵循这个答案,但我不知道片段标签,因为我还没有设置它。

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

最新更新