1

I am using Viewpager. Inside i am using fragment and its contains Recyclerview. Whenever i change to another view page then it crash and shows the java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true

java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(Unknown Source) at android.support.v7.widget.RecyclerView$Recycler.recycleView(Unknown Source) at android.support.v7.widget.RecyclerView$LayoutManager.removeAndRecycleViewAt(Unknown Source) at android.support.v7.widget.RecyclerView$LayoutManager.removeAndRecycleAllViews(Unknown Source) at android.support.v7.widget.RecyclerView.setAdapterInternal(Unknown Source) at android.support.v7.widget.RecyclerView.setAdapter(Unknown Source) at com.itc.classmate.om.gq(Unknown Source) at com.itc.classmate.activities.CreateTimetableActivity$6.onPageSelected(Unknown Source) at android.support.v4.view.ViewPager.dispatchOnPageSelected(Unknown Source) at android.support.v4.view.ViewPager.scrollToItem(Unknown Source) at android.support.v4.view.ViewPager.setCurrentItemInternal(Unknown Source) at android.support.v4.view.ViewPager.setCurrentItemInternal(Unknown Source) at android.support.v4.view.ViewPager.setCurrentItem(Unknown Source) at android.support.design.widget.TabLayout$h.b(Unknown Source) at android.support.design.widget.TabLayout.b(Unknown Source) at android.support.design.widget.TabLayout.a(Unknown Source) at android.support.design.widget.TabLayout$e.select(Unknown Source) at android.support.design.widget.TabLayout$g.performClick(Unknown Source) at android.view.View$PerformClick.run(View.java:21168) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5459) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

I tried with

  1. https://stackoverflow.com/a/30697644/9520307
  2. https://stackoverflow.com/a/46253054/9520307

You can see My code for understanding the things:

@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }

    private void init() {
        mTimeTableDataList = new ArrayList<>();
        mUserID = getArguments().getString(Constant.KEY_USERID);
        AppLog.log(TAG, "userid+++ " + mUserID);
        if (mCurrDay == -1) {
            mCurrDay = ((CreateTimetableActivity) getContext()).mTabItems.get(0).getDayID();
        }
    }


    // java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = null;
        view = inflater.inflate(R.layout.fragment_timetable, container, false);
//        mRecyclerViewTimetable = (RecyclerView) view.findViewById(R.id.recyclerview_timetable);
//        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
//        layoutManager.setItemPrefetchEnabled(false);
//        mRecyclerViewTimetable.setLayoutManager(layoutManager);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mRecyclerViewTimetable = (RecyclerView) getView().findViewById(R.id.recyclerview_timetable);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
        layoutManager.setItemPrefetchEnabled(false);
        mRecyclerViewTimetable.setLayoutManager(layoutManager);
        //-------------------------------------------------------
        initView();
        initRecyclerViewAdapter();
        //--------------------------------------------------------
    }

    public void update(int pFragmentPostion) {
        AppLog.log(TAG, "pDay " + pFragmentPostion);
        mCurrDay = pFragmentPostion;
        initView();
//        if(mTimetableAdapter!=null){
//            mTimetableAdapter.notifyDataSetChanged();
//        }
        initRecyclerViewAdapter();
    }

    private void initView() {
        if (getContext() != null && mCurrDay != -1) {
            if (!SharedPreferences.getInstance(getContext()).isMessageAppeared(mUserID)) {
                //-----------------------------
                TableDays tableDays = new TableDays();
                tableDays.openDB(getContext());
                TableTimeTableDataModel firstDayOfWeekDay = tableDays.getFirstDayOfWeekDay(mUserID);
                int mFirstDay = -1;
                if (firstDayOfWeekDay != null) {
                    mFirstDay = firstDayOfWeekDay.getDayID();
                }
                tableDays.closeDB();
                //----------------------------
                AppLog.log(TAG, "mCurrDay:" + mCurrDay + ", mFirstDay:" + mFirstDay);
                if (getContext() != null && isFirstDayOfTimetableFilled(mCurrDay, mFirstDay)) {
                    try {
                        readFromTimeTable(mCurrDay, mFirstDay);
                        //pp initRecyclerViewAdapter();
                    } catch (Exception e) {
                        AppLog.errLog(TAG, "initView " + e.getMessage());
                    }
                }
            } else {
                //read data from the table for the currday
                TableTimeTable table = new TableTimeTable();
                table.openDB(getContext());
                mTimeTableDataList = null;
                mTimeTableDataList = table.getTimeTableForDay(mUserID, mCurrDay);
                table.closeDB();
                //-------------------------------------------
                //pp initRecyclerViewAdapter();
            }
        }
    }

    private boolean isFirstDayOfTimetableFilled(int mCurrDay, int pFirstDay) {
        if (mCurrDay != pFirstDay) {
            TableTimeTable tableTimeTable = new TableTimeTable();
            tableTimeTable.openDB(getContext());
            ArrayList<TableTimeTableDataModel> list = tableTimeTable.getTimeTableForDay(mUserID, pFirstDay);
            tableTimeTable.closeDB();
            if (list.isEmpty()) {
                showDialogForTimeTableFirstDayNotFilled();
                return false;
            }
        }
        //Toast.makeText(getString(R.string.msg_fill_first_day_timetable), true);
        return true;
    }

Note:I wanted to clear that i have seen links of stackoverflow which have same kind of problem and they did try to resolve. I also followed the step still issue is presist.

Honeywell
  • 281
  • 2
  • 13
  • https://stackoverflow.com/a/40833186/7666442 – AskNilesh Mar 26 '18 at 08:32
  • 2
    Possible duplicate of ["Scrapped or attached views may not be recycled" since support lib 25.0.0](https://stackoverflow.com/questions/40263355/scrapped-or-attached-views-may-not-be-recycled-since-support-lib-25-0-0) – Vidhi Dave Mar 26 '18 at 08:33
  • 1
    @VishvaDave, Nilesh : i tried with same link too. Still i am getting the same issue. Can you go through the code for better understanding. – Honeywell Mar 26 '18 at 08:40

0 Answers0