ZKListView.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. * ZKListView.h
  3. *
  4. * Created on: Jun 28, 2017
  5. * Author: guoxs
  6. */
  7. #ifndef _CONTROL_ZKLISTVIEW_H_
  8. #define _CONTROL_ZKLISTVIEW_H_
  9. #include "ZKButton.h"
  10. class ZKListViewPrivate;
  11. class ZKListSubItemPrivate;
  12. /**
  13. * @brief 列表控件
  14. */
  15. class ZKListView : public ZKBase {
  16. ZK_DECLARE_PRIVATE(ZKListView)
  17. public:
  18. ZKListView(ZKBase *pParent);
  19. virtual ~ZKListView();
  20. public:
  21. class ZKListItem;
  22. class ZKListSubItem : public ZKButton {
  23. friend class ZKListView;
  24. friend class ZKListItem;
  25. ZK_DECLARE_PRIVATE(ZKListSubItem)
  26. public:
  27. ZKListSubItem();
  28. virtual ~ZKListSubItem();
  29. protected:
  30. virtual bool createWindow() { return false; }
  31. virtual const char* getClassName() const { return NULL; }
  32. void drawSubItem(ZKCanvas *pCanvas, int xOffset, int yOffset);
  33. int getLongClickTimeOut() const;
  34. int getLongClickIntervalTime() const;
  35. };
  36. class ZKListItem : public ZKListSubItem {
  37. friend class ZKListView;
  38. friend class ZKListViewPrivate;
  39. public:
  40. ZKListItem();
  41. virtual ~ZKListItem();
  42. /**
  43. * @brief 通过ID值获取子项
  44. */
  45. ZKListSubItem* findSubItemByID(int id) const;
  46. int getSubItemCount() const { return mSubItemCount; }
  47. protected:
  48. virtual void onBeforeCreateWindow(const Json::Value &json);
  49. int hitItemID(const MotionEvent &ev);
  50. void drawItem(ZKCanvas *pCanvas, int xOffset, int yOffset);
  51. void setItemPressed(int itemID, bool isPressed);
  52. private:
  53. void parseListItemAttributeFromJson(const Json::Value &json);
  54. private:
  55. ZKListSubItem **mListSubItemList;
  56. int mSubItemCount;
  57. };
  58. /**
  59. * @brief 数据与UI绑定适配器
  60. */
  61. class AbsListAdapter {
  62. friend class ZKListView;
  63. public:
  64. virtual ~AbsListAdapter() { }
  65. virtual int getListItemCount(const ZKListView *pListView) const = 0;
  66. virtual void obtainListItemData(ZKListView *pListView, ZKListItem *pListItem, int index) = 0;
  67. /**
  68. * 数据更新,重绘UI
  69. */
  70. void notifyDataSetChanged(ZKListView *pListView) {
  71. if (pListView) {
  72. pListView->refreshListView();
  73. }
  74. }
  75. };
  76. /**
  77. * @brief 列表项点击监听接口
  78. */
  79. class IItemClickListener {
  80. public:
  81. virtual ~IItemClickListener() { }
  82. virtual void onItemClick(ZKListView *pListView, int index, int itemID) = 0;
  83. };
  84. /**
  85. * @brief 列表项长按监听接口
  86. */
  87. class IItemLongClickListener {
  88. public:
  89. virtual ~IItemLongClickListener() { }
  90. virtual void onItemLongClick(ZKListView *pListView, int index, int itemID) = 0;
  91. };
  92. void setListAdapter(AbsListAdapter *pAdapter);
  93. void setItemClickListener(IItemClickListener *pListener);
  94. void setItemLongClickListener(IItemLongClickListener *pListener);
  95. /**
  96. * @brief 刷新列表
  97. */
  98. void refreshListView();
  99. /**
  100. * @brief 跳转到指定行或列
  101. */
  102. void setSelection(int index);
  103. /**
  104. * @brief 获取列表项宽
  105. */
  106. uint32_t getItemWidth() const;
  107. /**
  108. * @brief 获取列表项高
  109. */
  110. uint32_t getItemHeight() const;
  111. /**
  112. * @brief 获取列表行数
  113. */
  114. uint32_t getRows() const;
  115. /**
  116. * @brief 获取列表列数
  117. */
  118. uint32_t getCols() const;
  119. /**
  120. * @brief 获取列表总项数
  121. */
  122. int getListItemCount() const;
  123. /**
  124. * @brief 获取第一个可见项的索引值
  125. */
  126. int getFirstVisibleItemIndex() const;
  127. /**
  128. * @brief 获取第一个可见项的偏移值
  129. */
  130. int getFirstVisibleItemOffset() const;
  131. /**
  132. * @brief 设置惯性滑动减速比例
  133. * @param ratio 减速比例 范围: 0 < ratio < 1
  134. */
  135. void setDecRatio(float ratio);
  136. protected:
  137. ZKListView(ZKBase *pParent, ZKBasePrivate *pBP);
  138. virtual void onBeforeCreateWindow(const Json::Value &json);
  139. virtual const char* getClassName() const { return ZK_LISTVIEW; }
  140. virtual void onDraw(ZKCanvas *pCanvas);
  141. virtual bool onTouchEvent(const MotionEvent &ev);
  142. virtual void onTimer(int id);
  143. private:
  144. void parseListViewAttributeFromJson(const Json::Value &json);
  145. };
  146. #endif /* _CONTROL_ZKLISTVIEW_H_ */