{ "id": "112760", "key": "TIMOB-13610", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "15699", "description": "2013 Sprint 21", "name": "2013 Sprint 21", "archived": true, "released": true, "releaseDate": "2013-10-18" }, { "id": "15700", "description": "2013 Sprint 21 API", "name": "2013 Sprint 21 API", "archived": true, "released": true, "releaseDate": "2013-10-18" }, { "id": "14982", "description": "Release 3.2.0", "name": "Release 3.2.0", "archived": false, "released": true, "releaseDate": "2013-12-19" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2013-10-10T18:08:12.000+0000", "created": "2013-04-12T13:51:54.000+0000", "priority": { "name": "Medium", "id": "3" }, "labels": [ "android", "exalture", "listview", "scrollableview", "scrollview", "tableview" ], "versions": [], "issuelinks": [ { "id": "32342", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "120880", "key": "TIMOB-15408", "fields": { "summary": "Android: TableView/ListView behaves incorrectly when ScrollableView inside TableView/ListView", "status": { "description": "The issue is open and ready for the assignee to start work on it.", "name": "Open", "id": "1", "statusCategory": { "id": 2, "key": "new", "colorName": "blue-gray", "name": "To Do" } }, "priority": { "name": "Low", "id": "4" }, "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false } } } } ], "assignee": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2013-11-13T18:04:26.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10202", "name": "Android", "description": "Android Platform" } ], "description": "*Problem description*\r\nIf you put a scrollableview inside a tableview/listview/scrollview, it s almost unusable as described in the docs: http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.TableView\r\n{quote}\r\nAs a table view inherently scrolls, it creates a very poor user experience when one contains other scrolling views, such as a ScrollableView or TextArea. Thus, this layout is strongly discouraged. \r\n{quote}\r\n\r\nThe following pull request fixes that:\r\n\r\n*Pull request*\r\nhttps://github.com/appcelerator/titanium_mobile/pull/4153\r\n\r\n*Steps to reproduce*\r\n1. Run the reproduction test case.\r\n2. See that scrolling the scroll view horizontally causes it to sometimes repel swiping.\r\n\r\n*Reproduction test case (any SDK)*\r\n{code}\r\nvar win = Ti.UI.createWindow({\r\n backgroundColor : 'white',\r\n modal : false\r\n});\r\n \r\nvar table = Ti.UI.createTableView();\r\nvar rowData = [];\r\n \r\nvar scrollable = Ti.UI.createScrollableView({\r\n top:0,\r\n left:0,\r\n bottom:0,\r\n right:0,\r\n backgroundColor:'orange',\r\n views : [Ti.UI.createView({\r\n backgroundColor : 'blue'\r\n }), Ti.UI.createView({\r\n backgroundColor : 'green'\r\n }), Ti.UI.createView({\r\n backgroundColor : 'yellow'\r\n })]\r\n})\r\n \r\nvar row = Ti.UI.createTableViewRow({\r\n height : 120\r\n});\r\nrow.add(scrollable);\r\nrowData.push(row);\r\n \r\nfor (var i = 0; i < 40; i++) {\r\n rowData.push(Ti.UI.createTableViewRow({\r\n title : (\"test2 \" + i)\r\n }));\r\n}\r\ntable.data = rowData;\r\n \r\nwin.add(table);\r\nwin.open();\r\n{code}\r\n\r\n*Pull request test case*\r\n{code}\r\n// open a single window\r\n\r\nfunction tableviewtest() {\r\n\tvar win = Ti.UI.createWindow({\r\n\t\tbackgroundColor : 'white',\r\n\t\tmodal : false\r\n\t});\r\n\r\n\tvar table = Ti.UI.createTableView();\r\n\tvar rowData = [];\r\n\r\n\tvar scrollable = Ti.UI.createScrollableView({\r\n\t\tviews : [Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'blue'\r\n\t\t}), Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'green'\r\n\t\t}), Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'yellow'\r\n\t\t})]\r\n\t})\r\n\r\n\tvar row = Ti.UI.createTableViewRow({\r\n\t\theight : 120\r\n\t});\r\n\trow.add(scrollable);\r\n\trowData.push(row);\r\n\r\n\tfor (var i = 0; i < 40; i++) {\r\n\t\trowData.push(Ti.UI.createTableViewRow({\r\n\t\t\ttitle : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\ttable.data = rowData;\r\n\r\n\twin.add(table);\r\n\twin.open();\r\n}\r\n\r\nfunction scrolliewtest() {\r\n\tvar win = Ti.UI.createWindow({\r\n\t\tbackgroundColor : 'white',\r\n\t\tmodal : false\r\n\t});\r\n\r\n\tvar scroll = Ti.UI.createScrollView({\r\n\t\tlayout : 'vertical'\r\n\t});\r\n\r\n\tvar scrollable = Ti.UI.createScrollableView({\r\n\t\theight : 120,\r\n\t\tviews : [Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'blue'\r\n\t\t}), Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'green'\r\n\t\t}), Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'yellow'\r\n\t\t})]\r\n\t})\r\n\r\n\tfor (var i = 0; i < 3; i++) {\r\n\t\tscroll.add(Ti.UI.createLabel({\r\n\t\t\theight : 80,\r\n\t\t\ttext : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\tscroll.add(scrollable);\r\n\r\n\tfor (var i = 0; i < 40; i++) {\r\n\t\tscroll.add(Ti.UI.createLabel({\r\n\t\t\theight : 80,\r\n\t\t\ttext : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\r\n\twin.add(scroll);\r\n\twin.open();\r\n}\r\n\r\nfunction scrolliewtabletest() {\r\n\tvar win = Ti.UI.createWindow({\r\n\t\tbackgroundColor : 'white',\r\n\t\tmodal : false\r\n\t});\r\n\r\n\tvar scroll = Ti.UI.createScrollView({\r\n\t\tscrollType : 'horizontal',\r\n\t\thorizontalWrap : false,\r\n\t\tlayout : 'horizontal'\r\n\t});\r\n\r\n\tvar table = Ti.UI.createTableView({\r\n\t\twidth : 800\r\n\t});\r\n\tvar rowData = [];\r\n\r\n\tfor (var i = 0; i < 40; i++) {\r\n\t\trowData.push(Ti.UI.createTableViewRow({\r\n\t\t\ttitle : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\ttable.data = rowData;\r\n\r\n\tfor (var i = 0; i < 3; i++) {\r\n\t\tscroll.add(Ti.UI.createLabel({\r\n\t\t\twidth : 80,\r\n\t\t\ttext : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\tscroll.add(table);\r\n\r\n\tfor (var i = 0; i < 40; i++) {\r\n\t\tscroll.add(Ti.UI.createLabel({\r\n\t\t\twidth : 80,\r\n\t\t\ttext : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\r\n\twin.add(scroll);\r\n\twin.open();\r\n}\r\n\r\nfunction scrollabletest() {\r\n\tvar win = Ti.UI.createWindow({\r\n\t\tbackgroundColor : 'white',\r\n\t\tmodal : false\r\n\t});\r\n\r\n\tvar scroll = Ti.UI.createScrollableView({\r\n\r\n\t});\r\n\r\n\tvar table = Ti.UI.createTableView({\r\n\t\twidth : 300,\r\n\t\tleft : 40,\r\n\t\tright : 40,\r\n\t\tbackgroundColor : 'green'\r\n\t});\r\n\r\n\tvar rowData = [];\r\n\r\n\tfor (var i = 0; i < 40; i++) {\r\n\t\trowData.push(Ti.UI.createTableViewRow({\r\n\t\t\ttitle : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\ttable.data = rowData;\r\n\r\n\tscroll.addView(table);\r\n\r\n\tvar scroll2 = Ti.UI.createScrollView({\r\n\t\tlayout : 'vertical'\r\n\t});\r\n\r\n\tfor (var i = 0; i < 40; i++) {\r\n\t\tscroll2.add(Ti.UI.createLabel({\r\n\t\t\theight : 80,\r\n\t\t\ttext : (\"test \" + i)\r\n\t\t}));\r\n\t}\r\n\r\n\tscroll.addView(scroll2);\r\n\twin.add(scroll);\r\n\twin.open();\r\n}\r\n\r\nvar win = Ti.UI.createWindow({\r\n\tbackgroundColor : 'white'\r\n});\r\nvar tableview = Ti.UI.createTableView({\r\n\trowHeight : 120,\r\n\tdata : [{\r\n\t\ttitle : 'tableviewtest',\r\n\t\tcallback : tableviewtest\r\n\t}, {\r\n\t\ttitle : 'scrolliewtest',\r\n\t\tcallback : scrolliewtest\r\n\t}, {\r\n\t\ttitle : 'scrolliewtabletest',\r\n\t\tcallback : scrolliewtabletest\r\n\t}, {\r\n\t\ttitle : 'scrollabletest',\r\n\t\tcallback : scrollabletest\r\n\t}]\r\n})\r\ntableview.addEventListener('click', function(e) {\r\n\tif (e.rowData && e.rowData.callback)\r\n\t\te.rowData.callback();\r\n})\r\nwin.add(tableview);\r\nwin.open();\r\n{code}", "attachment": [], "flagged": false, "summary": "Android: Proposed fix for poor user experience when scrollableView is inside tableview/listview/scrollview", "creator": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "subtasks": [], "reporter": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "environment": "titanium 3.2.0 master\r\nandroid 4.0", "comment": { "comments": [ { "id": "247271", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "pull request\nhttps://github.com/appcelerator/titanium_mobile/pull/4153", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-04-12T14:17:37.000+0000", "updated": "2013-04-12T14:17:37.000+0000" }, { "id": "247372", "author": { "name": "dsefton", "key": "dsefton", "displayName": "Daniel Sefton", "active": true, "timeZone": "America/Los_Angeles" }, "body": "So I tried your test case with 3.1 CI on Samsung Galaxy S2 Android 2.3.6... It seems to work fine. Please could you add reproduction steps and describe exactly what the problem is? Or add a test case which reproduces your problem you described, not just testing your pull request.\r\n\r\nThanks!", "updateAuthor": { "name": "dsefton", "key": "dsefton", "displayName": "Daniel Sefton", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-04-12T23:06:13.000+0000", "updated": "2013-04-12T23:06:13.000+0000" }, { "id": "247403", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "test case to show the problem added", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-04-13T07:06:13.000+0000", "updated": "2013-04-13T07:06:13.000+0000" }, { "id": "248065", "author": { "name": "dsefton", "key": "dsefton", "displayName": "Daniel Sefton", "active": true, "timeZone": "America/Los_Angeles" }, "body": "By unusable do you mean laggy? Again, I tried your new test case on Samsung Galaxy S2 Android 2.3.6 with 3.1 GA... It scrolls fine for me...\n\nI'll escalate anyway since you have a PR.", "updateAuthor": { "name": "dsefton", "key": "dsefton", "displayName": "Daniel Sefton", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-04-17T23:16:30.000+0000", "updated": "2013-04-17T23:16:30.000+0000" }, { "id": "248113", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "@Daniel:\r\n\r\nFirst i am not sure why but something was making the scrollableview not appear when i just tested it. So see the updated test case bellow.\r\n\r\nNow i just tried again if you try using the scrollableview you ll see that changing page is a nightmare. THis is a know problem explain [here|http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.TableView]\r\nWith my PR everything should go smoothly even in a listview\r\n\r\n{code}\r\nvar win = Ti.UI.createWindow({\r\n backgroundColor : 'white',\r\n modal : false\r\n});\r\n\r\nvar table = Ti.UI.createTableView();\r\nvar rowData = [];\r\n\r\nvar scrollable = Ti.UI.createScrollableView({\r\n\ttop:0,\r\n\tleft:0,\r\n\tbottom:0,\r\n\tright:0,\r\n\tbackgroundColor:'orange',\r\n views : [Ti.UI.createView({\r\n backgroundColor : 'blue'\r\n }), Ti.UI.createView({\r\n backgroundColor : 'green'\r\n }), Ti.UI.createView({\r\n backgroundColor : 'yellow'\r\n })]\r\n})\r\n\r\nvar row = Ti.UI.createTableViewRow({\r\n height : 120\r\n});\r\nrow.add(scrollable);\r\nrowData.push(row);\r\n\r\nfor (var i = 0; i < 40; i++) {\r\n rowData.push(Ti.UI.createTableViewRow({\r\n title : (\"test2 \" + i)\r\n }));\r\n}\r\ntable.data = rowData;\r\n\r\nwin.add(table);\r\nwin.open();\r\n{code}", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-04-18T07:00:59.000+0000", "updated": "2013-04-18T07:00:59.000+0000" }, { "id": "248177", "author": { "name": "dsefton", "key": "dsefton", "displayName": "Daniel Sefton", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Thanks Martin - I have now confirmed what you described.", "updateAuthor": { "name": "dsefton", "key": "dsefton", "displayName": "Daniel Sefton", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-04-18T17:36:07.000+0000", "updated": "2013-04-18T17:36:07.000+0000" }, { "id": "265866", "author": { "name": "sunila", "key": "sunila", "displayName": "Sunila", "active": true, "timeZone": "Asia/Kolkata" }, "body": "Looks like there is already a PR", "updateAuthor": { "name": "sunila", "key": "sunila", "displayName": "Sunila", "active": true, "timeZone": "Asia/Kolkata" }, "created": "2013-08-10T06:36:34.000+0000", "updated": "2013-08-10T06:36:34.000+0000" }, { "id": "265872", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "Yes there is a PR ;) but it s quite old now...", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-08-10T09:03:24.000+0000", "updated": "2013-08-10T09:03:24.000+0000" }, { "id": "271887", "author": { "name": "hpham", "key": "hpham", "displayName": "Hieu Pham", "active": true, "timeZone": "America/Los_Angeles" }, "body": "We strongly discourage the use of tableview/listview inside a scrollview, as documented. It is a viable workaround for users who wish to do this, but I don't think we should be merging it into master. Closing issue.", "updateAuthor": { "name": "hpham", "key": "hpham", "displayName": "Hieu Pham", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-09-19T04:11:39.000+0000", "updated": "2013-09-19T04:11:39.000+0000" }, { "id": "271892", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "I cant believe what i am reading!\r\nYou are actually refusing a PR which fixes a UI experience without any drawback?\r\nYou know you are actually preventing Ti users to create UI like we see on native apps just because of that PR?", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-09-19T07:04:33.000+0000", "updated": "2013-09-19T07:04:33.000+0000" }, { "id": "271893", "author": { "name": "rborn", "key": "rborn", "displayName": "Dan Tamas", "active": true, "timeZone": "Europe/Berlin" }, "body": "@martin - don't get angry, not all the PRs are making it into the core, sometimes even if they look/are legit, however, @Hieu you DIDN'T READ what Martin says: there is a \"scrollable INSIDE a tableRow\", and not a \"table inside a scrollview\".\r\n\r\nWe might need this sometimes, think on the the Appstore app, you can scroll horizontally to see the screenshots and vertically to see the content. \r\nThis should be smooth on android as well.\r\n\r\nJust my 2c", "updateAuthor": { "name": "rborn", "key": "rborn", "displayName": "Dan Tamas", "active": true, "timeZone": "Europe/Berlin" }, "created": "2013-09-19T09:11:50.000+0000", "updated": "2013-09-19T09:12:04.000+0000" }, { "id": "271894", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "@Dan: you are right, i am not getting angry ;) (i might have answered too early in the morning though …)\r\nWhat bugs me is refusing a PR which improves interaction without drawback (that i can see since i have been using it :P)\r\nI can change my PR if necessary just to work with scrollable inside tableview and not the other way around (though i will keep it in my branch). \r\n\r\nThanks Dan for your 2c", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-09-19T09:16:39.000+0000", "updated": "2013-09-19T09:16:39.000+0000" }, { "id": "271898", "author": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~farfromrefuge] and [~rborn] One question I have, as suggested above, is that fixing this \"has no drawbacks.\" I have certainly seen cases where fixing one issue can cause unintentended behavior changes or regressions elsewhere. How can we prove that's not the case?", "updateAuthor": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-09-19T12:38:03.000+0000", "updated": "2013-09-19T12:46:26.000+0000" }, { "id": "271901", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "I cant prove it Ingo…\r\nBUT i have proof that it as NO effect when not using tableview inside scrollview or the other way. It s the implementation...\r\nSo the edge case is only in a case you \"discourage\" (and still appears in a LOT of recent apps, aero, cinemur, yahoo weather,…)\r\nFinally that PR only mimic the way it s already implemented on iOS", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-09-19T14:15:42.000+0000", "updated": "2013-09-19T14:15:42.000+0000" }, { "id": "273261", "author": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~farfromrefuge], your PR will introduce some regressions. For example, if we run the test case below with your fix, the table view is not scrollable at all. But it scrolls fine without your fix.\r\n{code}\r\nvar win = Ti.UI.createWindow({\r\n\tbackgroundColor : 'white',\r\n\tmodal : false\r\n});\r\n\r\nvar table = Ti.UI.createTableView();\r\nvar rowData = [];\r\n\r\nfor (var i = 0; i < 10; i++) {\r\n\tvar scrollable = Ti.UI.createScrollableView({\r\n\t\ttop : 0,\r\n\t\tleft : 0,\r\n\t\tbottom : 0,\r\n\t\tright : 0,\r\n\t\tbackgroundColor : 'orange',\r\n\t\tviews : [Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'blue'\r\n\t\t}), Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'green'\r\n\t\t}), Ti.UI.createView({\r\n\t\t\tbackgroundColor : 'yellow'\r\n\t\t})]\r\n\t});\r\n\r\n\tvar row = Ti.UI.createTableViewRow({\r\n\t\theight : 300\r\n\t});\r\n\trow.add(scrollable);\r\n\trowData.push(row);\r\n}\r\n\r\nfor (var i = 0; i < 40; i++) {\r\n\trowData.push(Ti.UI.createTableViewRow({\r\n\t\ttitle : (\"test2 \" + i)\r\n\t}));\r\n}\r\ntable.data = rowData;\r\n\r\nwin.add(table);\r\nwin.open(); \r\n{code}", "updateAuthor": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-09-27T21:41:14.000+0000", "updated": "2013-09-27T21:42:25.000+0000" }, { "id": "273298", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "Thanks for pointing that out. I fixed it by implementing it another way\r\nNew PR https://github.com/appcelerator/titanium_mobile/pull/4748", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2013-09-28T10:04:25.000+0000", "updated": "2013-09-28T10:04:25.000+0000" }, { "id": "273903", "author": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Two more test cases.\r\nScrollableView inside scrollview:\r\n{code}\r\nvar win = Ti.UI.createWindow({\r\n backgroundColor : 'white',\r\n modal : false\r\n});\r\n \r\nvar scrollView = Ti.UI.createScrollView({\r\n contentWidth: 'auto',\r\n contentHeight: 4000,\r\n showVerticalScrollIndicator: true\r\n});\r\n\r\nfor (var i = 0; i < 10; i++) {\r\n var scrollable = Ti.UI.createScrollableView({\r\n top : 10*i + 300 *i,\r\n left : 0,\r\n bottom : 0,\r\n right : 0,\r\n height: 300,\r\n backgroundColor : 'orange',\r\n views : [Ti.UI.createView({\r\n \tbackgroundColor : 'blue'\r\n }), Ti.UI.createView({\r\n \tbackgroundColor : 'green'\r\n }), Ti.UI.createView({\r\n \tbackgroundColor : 'yellow'\r\n })]\r\n });\r\n \r\n scrollView.add(scrollable);\r\n}\r\n \r\nvar view = Ti.UI.createView({\r\n backgroundColor:'#336699',\r\n borderRadius: 10,\r\n top: 3100,\r\n height: 200\r\n});\r\nscrollView.add(view);\r\n\r\nwin.add(scrollView);\r\nwin.open(); \r\n{code}\r\n\r\nScrollableView inside ListView:\r\n{code}\r\nvar win = Ti.UI.createWindow({backgroundColor: 'white'});\r\n\r\nvar plainTemplate = {\r\n childTemplates: [\r\n {\r\n type: 'Ti.UI.ScrollableView',\r\n bindId: 'scrollable',\r\n properties: {\r\n height: '300'\r\n }\r\n }\r\n ]\r\n};\r\n\r\nvar listView = Ti.UI.createListView({\r\n templates: { 'plain': plainTemplate },\r\n defaultItemTemplate: 'plain' \r\n});\r\n\r\nvar data = [];\r\nfor (var i = 0; i < 10; i++) {\r\n data.push({\r\n scrollable : { views : [Ti.UI.createView({\r\n \tbackgroundColor : 'blue'\r\n }), Ti.UI.createView({\r\n \tbackgroundColor : 'green'\r\n }), Ti.UI.createView({\r\n \tbackgroundColor : 'yellow'\r\n })] }\r\n });\r\n}\r\n\r\nvar section = Ti.UI.createListSection({items: data});\r\nlistView.sections = [section];\r\n\r\nwin.add(listView);\r\nwin.open();\r\n{code}", "updateAuthor": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-10-04T23:14:22.000+0000", "updated": "2013-10-04T23:44:31.000+0000" }, { "id": "274078", "author": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Tested the PR with the three test cases in my comments. It works fine for ScrollableView inside ScrollView. It exposes some issues on ScrollableView inside TableView/ListView. Those issues are not caused by this PR. Already filed TIMOB-15408 to follow up.", "updateAuthor": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-10-07T21:42:07.000+0000", "updated": "2013-10-07T21:42:07.000+0000" }, { "id": "274641", "author": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "body": "PR: https://github.com/appcelerator/titanium_mobile/pull/4748", "updateAuthor": { "name": "pwang", "key": "pwang", "displayName": "Ping Wang", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-10-10T18:08:25.000+0000", "updated": "2013-10-10T18:08:25.000+0000" }, { "id": "279359", "author": { "name": "sdowse", "key": "sdowse", "displayName": "Samuel Dowse", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Verified fixed on:\nMac OSX 10.9 Mavericks\nTitanium Studio, build: 3.2.0.201311122225\nTitanium SDK, build: 3.2.0.v20131112144044\nCLI: 3.2.0\nAlloy: 1.3.0\nAndroid Device: Xperia Arc S (4.0.4), Xperia U (2.3.3)\n\nAll test cases used from description and comments.\nAll work fine with no lag or other cause for \"poor user experience\".\nClosing.", "updateAuthor": { "name": "sdowse", "key": "sdowse", "displayName": "Samuel Dowse", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2013-11-13T18:04:19.000+0000", "updated": "2013-11-13T18:04:19.000+0000" } ], "maxResults": 21, "total": 21, "startAt": 0 } } }