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
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.