我有一个标签布局,其中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回答,但我不知道碎片标记,因为我没有设置它。
答案 0 :(得分:0)
我认为您应该只需要通过refreshItems()方法内的notify方法更新适配器,例如public void refreshItems(){ youradapter.notifydatasetchanged(); }
。这可能是在您调用另一个片段并设置适配器时引起的,或者您可能正在更改已更改的位置。