thewarpedcoder

Titanium Expand Collapse Tableview

Jan 31st, 2013
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.22 KB | None | 0 0
  1. /*
  2. * An example of how to enable accordion style collapse and expanding
  3. * using a table view with sections.
  4. *
  5. * Created November 2012 by Trevor Ward (thewarpedcoder)
  6. *
  7. */
  8. var tableDataLoad = [{
  9. sectionNum: 1,
  10. sectionTitle: 'Section 1',
  11. data: [{
  12. level: 1,
  13. title: 'Section 1 Level 1 Item 1',
  14. child: true
  15. }, {
  16. level: 2,
  17. title: ' Section 1 Level 2 Item 1',
  18. child: true
  19. }, {
  20. level: 3,
  21. title: ' Section 1 Level 3 Item 1',
  22. child: true
  23. }, {
  24. level: 4,
  25. title: ' Section 1 Level 4 Item 1',
  26. child: false
  27. }, {
  28. level: 4,
  29. title: ' Section 1 Level 4 Item 2',
  30. child: false
  31. }, {
  32. level: 4,
  33. title: ' Section 1 Level 4 Item 3',
  34. child: false
  35. }, {
  36. level: 3,
  37. title: ' Section 1 Level 3 Item 2',
  38. child: false
  39. }, {
  40. level: 3,
  41. title: ' Section 1 Level 3 Item 3',
  42. child: true
  43. }, {
  44. level: 4,
  45. title: ' Section 1 Level 4 Item 1',
  46. child: false
  47. }, {
  48. level: 4,
  49. title: ' Section 1 Level 4 Item 2',
  50. child: false
  51. }, {
  52. level: 2,
  53. title: ' Section 1 Level 2 Item 2',
  54. child: false
  55. }, {
  56. level: 2,
  57. title: ' Section 1 Level 2 Item 3',
  58. child: true
  59. }, {
  60. level: 3,
  61. title: ' Section 1 Level 3 Item 1',
  62. child: false
  63. }, {
  64. level: 3,
  65. title: ' Section 1 Level 3 Item 2',
  66. child: false
  67. }, {
  68. level: 3,
  69. title: ' Section 1 Level 3 Item 3',
  70. child: false
  71. }, {
  72. level: 2,
  73. title: ' Section 1 Level 2 Item 4',
  74. child: false
  75. }, {
  76. level: 1,
  77. title: 'Section 1 Level 1 Item 2',
  78. child: true
  79. }, {
  80. level: 2,
  81. title: ' Section 1 Level 2 Item 1',
  82. child: true
  83. }, {
  84. level: 3,
  85. title: ' Section 1 Level 3 Item 1',
  86. child: true
  87. }, {
  88. level: 4,
  89. title: ' Section 1 Level 4 Item 1',
  90. child: false
  91. }, {
  92. level: 4,
  93. title: ' Section 1 Level 4 Item 2',
  94. child: false
  95. }, {
  96. level: 4,
  97. title: ' Section 1 Level 4 Item 3',
  98. child: false
  99. }]
  100. }, {
  101. sectionNum: 2,
  102. sectionTitle: 'Section 2',
  103. data: [{
  104. level: 1,
  105. title: 'Section 2 Level 1 Item 1',
  106. child: true
  107. }, {
  108. level: 2,
  109. title: ' Section 2 Level 2 Item 1',
  110. child: true
  111. }, {
  112. level: 3,
  113. title: ' Section 2 Level 3 Item 1',
  114. child: true
  115. }, {
  116. level: 4,
  117. title: ' Section 2 Level 4 Item 1',
  118. child: false
  119. }, {
  120. level: 4,
  121. title: ' Section 2 Level 4 Item 2',
  122. child: false
  123. }, {
  124. level: 4,
  125. title: ' Section 2 Level 4 Item 3',
  126. child: false
  127. }, {
  128. level: 3,
  129. title: ' Section 2 Level 3 Item 2',
  130. child: false
  131. }, {
  132. level: 3,
  133. title: ' Section 2 Level 3 Item 3',
  134. child: true
  135. }, {
  136. level: 4,
  137. title: ' Section 2 Level 4 Item 1',
  138. child: false
  139. }, {
  140. level: 4,
  141. title: ' Section 2 Level 4 Item 2',
  142. child: false
  143. }, {
  144. level: 2,
  145. title: ' Section 2 Level 2 Item 2',
  146. child: true
  147. }, {
  148. level: 3,
  149. title: ' Section 2 Level 3 Item 1',
  150. child: false
  151. }, {
  152. level: 3,
  153. title: ' Section 2 Level 3 Item 2',
  154. child: false
  155. }, {
  156. level: 3,
  157. title: ' Section 2 Level 3 Item 3',
  158. child: false
  159. }, {
  160. level: 2,
  161. title: ' Section 2 Level 2 Item 3',
  162. child: false
  163. }, {
  164. level: 2,
  165. title: ' Section 2 Level 2 Item 4',
  166. child: true
  167. }, {
  168. level: 3,
  169. title: ' Section 2 Level 3 Item 1',
  170. child: false
  171. }, {
  172. level: 3,
  173. title: ' Section 2 Level 3 Item 2',
  174. child: false
  175. }, {
  176. level: 3,
  177. title: ' Section 2 Level 3 Item 3',
  178. child: true
  179. }, {
  180. level: 4,
  181. title: ' Section 2 Level 4 Item 1',
  182. child: false
  183. }, {
  184. level: 4,
  185. title: ' Section 2 Level 4 Item 2',
  186. child: false
  187. }, {
  188. level: 4,
  189. title: ' Section 2 Level 4 Item 3',
  190. child: false
  191. }, {
  192. level: 4,
  193. title: ' Section 2 Level 4 Item 4',
  194. child: false
  195. }]
  196. }];
  197.  
  198. var win = null;
  199. var viewTable = null;
  200. var viewheight = 33;
  201. var imageheight = 18;
  202. var tableData = null;
  203. var sectionsData = [];
  204.  
  205. var minusImg = '/minus.png';
  206. var plusImg = '/plus.png';
  207.  
  208. function sectionProcess(inParam) {'use strict';
  209. var iCnt = 0;
  210. var tCnt = 0;
  211. var baseLevel = 0;
  212. var rowStart = 0;
  213.  
  214. var secTableData = viewTable.getData();
  215. var sectionData = secTableData[inParam.source.secValue - 1];
  216. var rowData = sectionData.rows;
  217. var setViewHeight = (inParam.source.EXPANDED) ? 0 : viewheight;
  218. var setImgHeight = (inParam.source.EXPANDED) ? 0 : imageheight;
  219. var childLevelChk = {};
  220. var keyChk = 'AA0';
  221.  
  222. inParam.source.EXPANDED = (inParam.source.EXPANDED) ? false : true;
  223.  
  224. while(iCnt < rowData.length) {
  225. var setRowHeight = setViewHeight;
  226. var setImgRowHeight = setImgHeight;
  227.  
  228. if (setRowHeight > 0) {
  229. if (rowData[iCnt].LEVEL === 1) {
  230. baseLevel += 1;
  231. keyChk = 'AA' + baseLevel;
  232. childLevelChk[keyChk] = [];
  233. childLevelChk[keyChk][1] = rowData[iCnt].CHILDEXPANDED;
  234. } else {
  235. var currLevel = rowData[iCnt].LEVEL;
  236. var prevLevel = currLevel - 1;
  237.  
  238. childLevelChk[keyChk][currLevel] = (childLevelChk[keyChk][prevLevel]) ? rowData[iCnt].CHILDEXPANDED : false;
  239.  
  240. setRowHeight = (childLevelChk[keyChk][prevLevel]) ? setViewHeight : 0;
  241. setImgRowHeight = (childLevelChk[keyChk][prevLevel]) ? setImgHeight : 0;
  242. }
  243. }
  244. if (rowData[iCnt].EXPANDED) {
  245. rowData[iCnt].height = setRowHeight;
  246. rowData[iCnt].children[0].height = setImgRowHeight;
  247. }
  248. iCnt += 1;
  249. }
  250. return;
  251. }
  252. function expandCollapseView(inParam) {'use strict';
  253. var inLevel = inParam.rowData.LEVEL;
  254. var inExpanded = inParam.rowData.CHILDEXPANDED;
  255. var rowTableData = viewTable.data;
  256.  
  257. // need to find the section of the row ...
  258. var secLevel = 0;
  259. var totalRowCnt = 0;
  260. var sectionRows = null;
  261. var sectionStartRow = 0;
  262. var currentSectionRow = 0;
  263. var childLevelChk = [];
  264.  
  265. for ( secLevel = 0; secLevel < rowTableData.length; secLevel += 1) {
  266. totalRowCnt = totalRowCnt + rowTableData[secLevel].rows.length;
  267.  
  268. if (totalRowCnt >= (inParam.index + 1)) {
  269. sectionRows = rowTableData[secLevel].rows;
  270. sectionStartRow = totalRowCnt - sectionRows.length;
  271. currentSectionRow = inParam.index - sectionStartRow;
  272. break;
  273. }
  274. }
  275. var setViewHeight = (inExpanded) ? 0 : viewheight;
  276. var setImgHeight = (inExpanded) ? 0 : imageheight;
  277. var tCnt = 0;
  278. var tmpLevel = 0;
  279. var bCnt = 0;
  280.  
  281. tCnt = currentSectionRow + 1;
  282.  
  283. childLevelChk[inLevel] = (inExpanded) ? false : true;
  284.  
  285. while (tCnt < sectionRows.length) {
  286. tmpLevel = sectionRows[tCnt].LEVEL;
  287.  
  288. if (tmpLevel <= inLevel) {
  289. break;
  290. }
  291. childLevelChk[tmpLevel] = (childLevelChk[tmpLevel - 1]) ? sectionRows[tCnt].CHILDEXPANDED : false;
  292.  
  293. sectionRows[tCnt].height = setViewHeight;
  294. sectionRows[tCnt].children[0].height = setImgHeight;
  295. sectionRows[tCnt].EXPANDED = (inExpanded) ? false : true;
  296. bCnt = tCnt + 1;
  297.  
  298. if (bCnt < sectionRows.length) {
  299. while (sectionRows[bCnt].LEVEL > tmpLevel) {
  300. // here is the complex one.... A child level can be expanded but a parent level can be collapsed so need to validate which it is ...
  301. childLevelChk[sectionRows[bCnt].LEVEL] = (childLevelChk[sectionRows[bCnt].LEVEL - 1]) ? sectionRows[bCnt].CHILDEXPANDED : false;
  302. var setRowHeight = (childLevelChk[sectionRows[bCnt].LEVEL - 1]) ? setViewHeight : 0;
  303. var setImgRowHeight = (childLevelChk[sectionRows[bCnt].LEVEL - 1]) ? setImgHeight : 0;
  304.  
  305. if (sectionRows[bCnt].EXPANDED) {
  306. sectionRows[bCnt].height = setRowHeight;
  307. sectionRows[bCnt].children[0].height = setImgRowHeight;
  308. }
  309. bCnt += 1;
  310.  
  311. if (bCnt >= sectionRows.length) {
  312. break;
  313. }
  314. }
  315. }
  316. tCnt = bCnt;
  317. }
  318. inParam.rowData.CHILDEXPANDED = (inExpanded) ? false : true;
  319. inParam.rowData.children[0].image = (inExpanded) ? plusImg : minusImg;
  320.  
  321. return;
  322. }
  323. function buildTableRow(inParam) {'use strict';
  324. var row = Ti.UI.createTableViewRow({
  325. title: inParam.title,
  326. height: viewheight,
  327. indentionLevel: inParam.level,
  328. backgroundGradient: {
  329. type: 'linear',
  330. colors: [{
  331. color: '#414141',
  332. offset: 0.0
  333. }, {
  334. color: '#B2B2B2',
  335. offset: 0.12
  336. }, {
  337. color: '#A1A1F1',
  338. offset: 0.85
  339. }]
  340. },
  341. color: '#ffffff',
  342. font: {
  343. fontSize: 14,
  344. fontWeight: 'normal'
  345. },
  346. LEVEL: inParam.level,
  347. EXPANDED: (inParam.level < 2) ? true : false,
  348. CHILDEXPANDED: (inParam.level < 1) ? true : false,
  349. CHILD: inParam.child
  350. });
  351. var rowImg = Ti.UI.createImageView({
  352. right: 30,
  353. height: 18,
  354. width: 18,
  355. top: 7,
  356. image: (inParam.child) ? plusImg : ''
  357. });
  358. var clickView = Ti.UI.createView({
  359. top: 0,
  360. left: 0,
  361. right: 0,
  362. bottom: 0,
  363. backgroundColor: 'transparent'
  364. });
  365. row.add(rowImg);
  366. row.add(clickView);
  367.  
  368. row.height = (inParam.level < 2) ? viewheight : 0;
  369. rowImg.height = (inParam.level < 2) ? imageheight : 0;
  370.  
  371. return row;
  372. }
  373. function processData() {'use strict';
  374. var dCnt = 0;
  375.  
  376. for ( dCnt = 0; dCnt < tableDataLoad.length; dCnt += 1) {
  377. var sectionView = Ti.UI.createView({
  378. top: 0,
  379. left: 0,
  380. right: 0,
  381. height: 33,
  382. backgroundGradient: {
  383. type: 'linear',
  384. colors: [{
  385. color: '#818181',
  386. offset: 0.0
  387. }, {
  388. color: '#B2B2B2',
  389. offset: 0.12
  390. }, {
  391. color: '#C3C3C3',
  392. offset: 0.85
  393. }]
  394. }
  395. });
  396. var sectionViewLabel = Ti.UI.createLabel({
  397. top: 0,
  398. left: 0,
  399. width: '100%',
  400. height: '100%',
  401. text: ' ' + tableDataLoad[dCnt].sectionTitle,
  402. textAlign: 'left',
  403. color: "#ffffff",
  404. font: {
  405. fontSize: 14,
  406. fontWeight: 'bold'
  407. },
  408. secValue: tableDataLoad[dCnt].sectionNum,
  409. EXPANDED: true
  410. });
  411. sectionView.add(sectionViewLabel);
  412. sectionView.addEventListener('touchend', sectionProcess);
  413.  
  414. var section = Ti.UI.createTableViewSection({
  415. headerView: sectionView
  416. });
  417. var rCnt = 0;
  418.  
  419. while (rCnt < tableDataLoad[dCnt].data.length) {
  420. section.add(buildTableRow(tableDataLoad[dCnt].data[rCnt]));
  421. rCnt += 1;
  422. }
  423. sectionsData.push(section);
  424. }
  425. viewTable.setData(sectionsData);
  426.  
  427. return;
  428. }
  429. function displayWindow() {'use strict';
  430. win = Ti.UI.createWindow({
  431. backgroundColor: '#3333FF'
  432. });
  433. var screenTitle = Ti.UI.createLabel({
  434. top: 10,
  435. left: 10,
  436. right: 10,
  437. height: 50,
  438. text: 'Table View Accordion',
  439. textAlign: 'center',
  440. color: '#ffffff',
  441. font: {
  442. fontSize: 18,
  443. fontWeight: 'bold'
  444. }
  445. });
  446. viewTable = Ti.UI.createTableView({
  447. top: 65,
  448. left: 20,
  449. right: 20,
  450. bottom: 50,
  451. rowHeight: 0,
  452. backgroundColor: 'transparent',
  453. separatorColor: '#000000',
  454. separatorStyle: 0
  455. });
  456. viewTable.addEventListener('touchend', expandCollapseView);
  457.  
  458. win.add(screenTitle);
  459. win.add(viewTable);
  460.  
  461. processData();
  462.  
  463. win.open();
  464.  
  465. return;
  466. }
  467. function startApp() {'use strict';
  468. displayWindow();
  469. }
  470. startApp();
Advertisement
Add Comment
Please, Sign In to add comment