Bug 27117 - Spinner Control GetView() gets called many times
Summary: Spinner Control GetView() gets called many times
Status: RESOLVED ANSWERED
Alias: None
Product: Android
Classification: Xamarin
Component: General ()
Version: 5.1
Hardware: PC Mac OS
: Normal normal
Target Milestone: ---
Assignee: Jonathan Pryor
URL:
Depends on:
Blocks:
 
Reported: 2015-02-16 19:18 UTC by Cody Beyer (MSFT)
Modified: 2015-02-19 14:03 UTC (History)
3 users (show)

Tags:
Is this bug a regression?: ---
Last known good build:

Notice (2018-05-24): bugzilla.xamarin.com is now in read-only mode.

Please join us on Visual Studio Developer Community and in the Xamarin and Mono organizations on GitHub to continue tracking issues. Bugzilla will remain available for reference in read-only mode. We will continue to work on open Bugzilla bugs, copy them to the new locations as needed for follow-up, and add the new items under Related Links.

Our sincere thanks to everyone who has contributed on this bug tracker over the years. Thanks also for your understanding as we make these adjustments and improvements for the future.


Please create a new report on Developer Community or GitHub with your current version information, steps to reproduce, and relevant error messages or log files if you are hitting an issue that looks similar to this resolved bug and you do not yet see a matching new report.

Related Links:
Status:
RESOLVED ANSWERED

Comment 1 Naqeeb 2015-02-17 04:02:17 UTC
I have checked this issue and able to reproduce it successfully. To reproduce this issue I have followed below steps.

1. Open attached test case in XS.
2. Deploy on Android Emulator.
3. Click on 'Dashboard' button.

I observe that when click on the 'Dashboard' button it is called each position multiple times same as in screen cast: http://www.screencast.com/t/hcnQ8Lgujj

Application Output: https://gist.github.com/Mohit-Kheterpal/cf596a20b0c80997e119
Ide log: https://gist.github.com/Mohit-Kheterpal/1fbf9320f00717ef6b58
XAP log: https://gist.github.com/Mohit-Kheterpal/af9681938e76c33631e1
Environment info: 
=== Xamarin Studio ===

Version 5.7.2 (build 1)
Installation UUID: 3dbf10c4-ed30-4e55-8a8b-1704777c7b5f
Runtime:
 Mono 3.12.0 ((detached/de2f33f)
 GTK+ 2.24.23 (Raleigh theme)

 Package version: 312000076

=== Apple Developer Tools ===

Xcode 5.1.1 (5085)
Build 5B1008

=== Xamarin.iOS ===

Version: 8.6.2.19 (Business Edition)
Hash: d508c8e
Branch: 
Build date: 2015-02-15 22:17:46-0500

=== Xamarin.Android ===

Version: 4.20.0.28 (Business Edition)
Android SDK: /Users/apprpject/Desktop/android-sdk-macosx
 Supported Android versions:
  2.1    (API level 7)
  2.2    (API level 8)
  2.3    (API level 10)
  3.1    (API level 12)
  4.0    (API level 14)
  4.0.3  (API level 15)
  4.1    (API level 16)
  4.2    (API level 17)
  4.3    (API level 18)
  4.4    (API level 19)
  4.4.87 (API level 20)
  5.0    (API level 21)
Java SDK: /usr
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

=== Xamarin.Mac ===

Version: 1.12.0.6 (Business Edition)

=== Build Information ===

Release ID: 507020001
Git revision: 103486e2547553077836a5ba20a973487b983830
Build date: 2015-02-13 11:56:36-05
Xamarin addins: 8dd5b934e86ef0595c022dd3930fd40e3376ab4c

=== Operating System ===

Mac OS X 10.8.5
Darwin localhost 12.5.0 Darwin Kernel Version 12.5.0
    Sun Sep 29 13:33:47 PDT 2013
    root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64
Comment 2 Jonathan Pryor 2015-02-18 10:58:58 UTC
Why do you believe that this is a problem?

Do you have a Java sample that indicates that behavior differs from what you're seeing in C#?

Having Adapter.getView() called multiple times is not unexpected:

https://www.google.com/search?&q=Adapter.getView+called+multiple+times
http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called-multiple-times-and-in-no-co
http://stackoverflow.com/a/2639159/83444

> there is absolutely no guarantee on the order in which getView()
> will be called nor how many times.

You're even hitting the exact scenario he points out:

> In your particular case you are doing the worst thing possible
> with a ListView by giving it a height=wrap_content. This forces
> ListView to measure a few children out of the adapter at layout
> time, to know how big it should be.

as AndroidControls/Resources/layout/DropDownListItemTemplate.axml contains:

        android:layout_height="wrap_content"
Comment 3 Amit Taparia 2015-02-19 11:07:36 UTC
I see what you are saying, but even after removing android:layout_height="wrap_content" the GetView is getting called multiple times.

There are couple of posts that does mention that if you change the android:layout_height from "wrap_content" to a static height or fill_parent, the getview will get called only once.

http://stackoverflow.com/questions/11186004/yet-another-getview-called-multiple-times

We have other adapters that we use to show "Card Stacks" & all where this behavior is not exhibited. I am wondering why this behavior is only enhibited in the Spinner.

If this is the expected behavior anyways, are there any recommendations as to how we can improve the performance. Our pages are becoming slow terribly as part of this problem.
Comment 4 Jonathan Pryor 2015-02-19 14:03:28 UTC
> If this is the expected behavior

"Expected behavior" is "whatever Java does." (Within "reason" [0].) The end.

As such, if you can create a Java app that does the same thing that results in different behavior, *then* I'd be more than happy to investigate further.

At present -- in the interests of not spending too much further time on this issue -- this resembles fairly well known Java behaviors, and thus doesn't appear to be an actual Xamarin.Android bug. It's a "feature"/"behavioral-ism" of the underlying Android platform, and is thus -- short of a "ported Java counterexample" -- Not My Problem™. ("Me" being "the binding guy." It could still fall under the purview of documentation and other teams, but they tend not be on bugzilla.)

> are there any recommendations as to how we can improve the performance.

The general performance-related advice I give is "reduce GREFs as much as possible."

Any Java guides on the performance aspects of .xml layout files should also be applicable.

[0]: I'll make exceptions for things that would otherwise require translating IL to Java byte code to obtain "expected behavior" or would otherwise bloat things, e.g. mirroring *all* members on Android Callable Wrappers without requiring [Export]/etc.