Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

List unscrollable with custom Adapter #8

Open
egfconnor opened this issue Aug 28, 2013 · 6 comments
Open

List unscrollable with custom Adapter #8

egfconnor opened this issue Aug 28, 2013 · 6 comments

Comments

@egfconnor
Copy link

I've tried using your code but it severely lags when using a custom adapter. Looping through every view in computeScrollY() and inflating tons of views seems terribly inefficient and I have no clue how this code could work.

Am I missing something or have you tested this on any other adapter?

@egfconnor
Copy link
Author

Setting a boolean so it runs once has fixed it, but I'm not sure what the side effects are:

listView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
boolean haveRan = false;

                        @Override
                        public void onGlobalLayout() {
                            if (haveRan == false) {
                                mQuickReturnHeight = quickReturnLayout
                                        .getHeight();
                                listView.computeScrollY();
                                haveRan = true;
                            }
                        }
                    });

@bkhall
Copy link

bkhall commented Sep 19, 2013

@egfconnor I think the issue relates to the fixed adapter size shown in the example. If you change the dataset (grow or shrink) in the adapter and then call notifyDataSetChanged on the adapter, an IndexOutOfBoundsException is thrown.

This is caused by the way @LarsWerkman defined the mItemOffsetY array in the computeScrollY function. As currently defined, the mItemOffestY array is defined ONLY once and the size is based on the initial size of the dataset.

To fix it so that it can accept changes in the dataset, change this line:

if (mItemOffsetY == null)

to

if (mItemOffsetY == null || mItemOffsetY.length != mItemCount)

That will allow the mItemOffsetY array to be redefined when the dataset changes and should allow it to work with custom adapters (especially cursoradapters and loaders).

@egfconnor
Copy link
Author

Thanks for the info @bkhall. I will try and test this soon as currently I have went away from using it completely. Will hopefully create a sample that isolates everything to a simple level.

@LarsWerkman
Copy link
Owner

Thanks @bkhall yeah you could do that I think!

@Zordid
Copy link

Zordid commented Mar 27, 2014

This is why I think this is not a good starting point in terms of breaking lots of conecpts crucial to ListViews and Adapters.
First: it breaks when adapter's content changes. Normally this is all well designed, a call to notifyDataSetChanged from the adapter informs all observers (the list). But this approach breaks this.
Second: in terms of efficiency it is a horrible mistake to call getView in a loop on ALL elements in the list. Never, ever, I repeat, never, ever, do this!

@AlexeyFreelancer
Copy link

@Zordid do you have another solution for implementation? Could you to share it?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants