【发布时间】: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),并在您想通过将新数据集传递给该方法来显示更新的记录时调用该方法。如果有,请记住使以前的数据无效