Search code examples
androidandroid-viewpagerandroid-nested-fragment

nestedviewpager nested fragment error


I have a Viewpager contains Recylerview which has 2 different holders. One of them is also view pager. Hence I have nested viewpager nad nested fragments. When I tap the second tab and tap back the first tab it is fine .But when I tap the third tab and tap back the first tab. It gives following error:

java.lang.IllegalArgumentException: No view found for id 0x7f0f00ce (:id/viewPagerComments) for fragment CommentFragment 

MainAcitivty

viewPager.setAdapter(new MainViewPagerAdapter(getSupportFragmentManager(),models.size()));

    navigationTabBar.setModels(models);
    navigationTabBar.setViewPager(viewPager, 0);

MainViewPagerAdapter

private int size;
public MainViewPagerAdapter(FragmentManager fm, int size) {
    super(fm);
    this.size = size;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            return DashboardtFragment.newInstance(size, position);
        default:
            return TempFragment.newInstance(size, position);
    }

}

DashboardtFragment

public static DashboardtFragment newInstance(int size, int index) {
    Bundle args = new Bundle();
    args.putInt(ARG_I,index);
    args.putInt(ARG_S,size);

    DashboardtFragment fragment = new DashboardtFragment();
    fragment.setArguments(args);
    return fragment;
} 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
    final View v = inflater.inflate(R.layout.dashboard_fragment, null);


    return v;
}
@Override
public void showRecyleview(DashboardResponseModel model) {
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    DashboardRecyleViewAdapter adapter = new DashboardRecyleViewAdapter(getActivity(),getChildFragmentManager(),model);
    recyclerView.setAdapter(adapter);
}

DashboardRecyleViewAdapter

public static class ViewHolder1 extends RecyclerView.ViewHolder {

    public ViewHolder1(View itemView) {
        super(itemView);
        viewPager = itemView.findViewById(R.id.viewPagerComments);

    }
}
case 1 : 
    return new ViewHolder1( layoutInflater.inflate(R.layout.dashboard_comments, parent, 
false));

case 1:
    ViewHolder1 viewHolder1 = (ViewHolder1) holder;
            viewPager.setAdapter(new CommentViewPagerAdapter(
                    childFragmentManager,
                    model.getCommentList().size(),
                    model.getCommentList()
            ));
            break;

CommentViewPagerAdapter

public CommentViewPagerAdapter(FragmentManager fm, int size, 
List<CommentList> list) {
    super(fm);
    this.size = size;
    this.list=list;
}

@Override
public Fragment getItem(int position) {

    return CommentFragment.newInstance(size,position,list.get(position));
}

CommentFragment

public static CommentFragment newInstance(int size, int index, CommentList 
comment) {
    Bundle args = new Bundle();
    args.putString(ARG_C,new Gson().toJson(comment));
    args.putInt(ARG_I,index);
    args.putInt(ARG_S,size);

    CommentFragment fragment = new CommentFragment();
    fragment.setArguments(args);
    return fragment;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
container, @Nullable Bundle savedInstanceState)
{
    final View v = inflater.inflate(R.layout.comment_content, null);

}

Solution

  • PagerAdapter mPagerAdapter;
    
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        super.setAdapter(null);
    }
    
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mPagerAdapter != null) {
            super.setAdapter(mPagerAdapter);
        }
    }
    
    @Override
    public void setAdapter(PagerAdapter adapter) {
    }
    
    public void storeAdapter(PagerAdapter pagerAdapter) {
        mPagerAdapter = pagerAdapter;
    }
    

    first create a customviewpager than add the above code. Use storeAdapter instead of setAdapter.