Malinskiy / SuperRecyclerView

Pumped up RecyclerView
2.63k stars 469 forks source link

Changing LayoutManager causing a ClassCastException #97

Open atabouraya opened 8 years ago

atabouraya commented 8 years ago

I was trying to change the LayoutManager from GridLayoutManager to LinearLayoutManager, It works fine until you scroll to the last item. According to the StackTrace this method is what's causing the Issue.

` private int getLastVisibleItemPosition(RecyclerView.LayoutManager layoutManager) {

int lastVisibleItemPosition = -1;
    if (layoutManagerType == null) {
        if (layoutManager instanceof GridLayoutManager) {
            layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
        } else if (layoutManager instanceof LinearLayoutManager) {
            layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
        } else if (layoutManager instanceof StaggeredGridLayoutManager) {
            layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
        } else {
            throw new RuntimeException("Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
        }
    }
    switch (layoutManagerType) {
        case LINEAR:
            lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
            break;
        case GRID:
            lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
            break;
        case STAGGERED_GRID:
            lastVisibleItemPosition = caseStaggeredGrid(layoutManager);
            break;
    }
    return lastVisibleItemPosition;
}`

It looks like layoutManagerType is only set when it's null, which means the first time only, that means it remains as GridLayoutManager when I set the LayoutManager the second time to LinearLayoutManager

apalala-dev commented 7 years ago

Any news on this issue?

It would be nice to have the bloc : if (layoutManagerType == null) { if (layoutManager instanceof GridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.GRID; } else if (layoutManager instanceof LinearLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR; } else if (layoutManager instanceof StaggeredGridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID; } else { throw new RuntimeException("Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager"); } }

in the method setLayoutManager() instead...

I have done a fork in which I made the change, I am a beginner at using GitHub (and git), but if you're interested it's there under the tag v1.1.5 : https://github.com/Kobatsu/SuperRecyclerView

It can be imported easily in Android Studio using JitPack (https://jitpack.io/)