@quicktvui/ai 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/package.json +1 -1
  2. package/rules/.clinerules +27 -4
  3. package/rules/.cursorrules +27 -4
  4. package/rules/.github/copilot-instructions.md +27 -4
  5. package/rules/.source/hippy/extend_views/CoverFlowHorizontalView.java +203 -0
  6. package/rules/.source/hippy/extend_views/CoverFlowVerticalView.java +203 -0
  7. package/rules/.source/hippy/extend_views/CoverFlowViewController.java +195 -0
  8. package/rules/.source/hippy/extend_views/EngineRootView.java +125 -0
  9. package/rules/.source/hippy/extend_views/ExtendTag.java +83 -0
  10. package/rules/.source/hippy/extend_views/FocusSearchHelper.java +124 -0
  11. package/rules/.source/hippy/extend_views/IRecyclerItemView.java +12 -0
  12. package/rules/.source/hippy/extend_views/JSEventHandleView.java +5 -0
  13. package/rules/.source/hippy/extend_views/MarqueeRelayManager.java +133 -0
  14. package/rules/.source/hippy/extend_views/MarqueeRelayTextView.java +211 -0
  15. package/rules/.source/hippy/extend_views/ProgressBarView.java +83 -0
  16. package/rules/.source/hippy/extend_views/ProgressBarViewController.java +145 -0
  17. package/rules/.source/hippy/extend_views/SeekBarView.java +104 -0
  18. package/rules/.source/hippy/extend_views/SeekBarViewController.java +218 -0
  19. package/rules/.source/hippy/extend_views/StateImageView.java +149 -0
  20. package/rules/.source/hippy/extend_views/StateImageViewController.java +34 -0
  21. package/rules/.source/hippy/extend_views/TVButtonView.java +314 -0
  22. package/rules/.source/hippy/extend_views/TVButtonViewController.java +89 -0
  23. package/rules/.source/hippy/extend_views/TVTextView.java +684 -0
  24. package/rules/.source/hippy/extend_views/TVViewActor.java +811 -0
  25. package/rules/.source/hippy/extend_views/TVViewActorHost.java +6 -0
  26. package/rules/.source/hippy/extend_views/TVViewActor/346/216/245/345/205/245.md +66 -0
  27. package/rules/.source/hippy/extend_views/TemplateUtil.java +336 -0
  28. package/rules/.source/hippy/extend_views/TextButtonNode.java +47 -0
  29. package/rules/.source/hippy/extend_views/TextViewController.java +377 -0
  30. package/rules/.source/hippy/extend_views/fastlist/CenterFlyInAnimator.java +96 -0
  31. package/rules/.source/hippy/extend_views/fastlist/ChildOnScreenScroller.java +548 -0
  32. package/rules/.source/hippy/extend_views/fastlist/ClonedViewTag.java +17 -0
  33. package/rules/.source/hippy/extend_views/fastlist/EventDeliverer.java +55 -0
  34. package/rules/.source/hippy/extend_views/fastlist/FastAdapter.java +4683 -0
  35. package/rules/.source/hippy/extend_views/fastlist/FastAdapterUtil.java +982 -0
  36. package/rules/.source/hippy/extend_views/fastlist/FastFlexNode.java +48 -0
  37. package/rules/.source/hippy/extend_views/fastlist/FastFlexView.java +873 -0
  38. package/rules/.source/hippy/extend_views/fastlist/FastFlexViewController.java +130 -0
  39. package/rules/.source/hippy/extend_views/fastlist/FastItemNode.java +67 -0
  40. package/rules/.source/hippy/extend_views/fastlist/FastItemView.java +306 -0
  41. package/rules/.source/hippy/extend_views/fastlist/FastItemViewController.java +106 -0
  42. package/rules/.source/hippy/extend_views/fastlist/FastListModule.java +95 -0
  43. package/rules/.source/hippy/extend_views/fastlist/FastListNode.java +90 -0
  44. package/rules/.source/hippy/extend_views/fastlist/FastListView.java +2466 -0
  45. package/rules/.source/hippy/extend_views/fastlist/FastListViewController.java +1038 -0
  46. package/rules/.source/hippy/extend_views/fastlist/FastListView/346/270/262/346/237/223/346/265/201/347/250/213/345/233/276.graffle +0 -0
  47. package/rules/.source/hippy/extend_views/fastlist/FastPendingView.java +47 -0
  48. package/rules/.source/hippy/extend_views/fastlist/ItemDecorations.java +71 -0
  49. package/rules/.source/hippy/extend_views/fastlist/ItemStoreNode.java +64 -0
  50. package/rules/.source/hippy/extend_views/fastlist/ItemStoreView.java +13 -0
  51. package/rules/.source/hippy/extend_views/fastlist/ItemStoreViewController.java +45 -0
  52. package/rules/.source/hippy/extend_views/fastlist/ListItemHolder.java +7 -0
  53. package/rules/.source/hippy/extend_views/fastlist/ListViewControlProp.java +41 -0
  54. package/rules/.source/hippy/extend_views/fastlist/MouseRecycleView.java +509 -0
  55. package/rules/.source/hippy/extend_views/fastlist/OnFastItemClickListener.java +12 -0
  56. package/rules/.source/hippy/extend_views/fastlist/OnFastItemFocusChangeListener.java +9 -0
  57. package/rules/.source/hippy/extend_views/fastlist/OnFastScrollStateChangedListener.java +7 -0
  58. package/rules/.source/hippy/extend_views/fastlist/PendingListNode.java +18 -0
  59. package/rules/.source/hippy/extend_views/fastlist/PendingViewController.java +13 -0
  60. package/rules/.source/hippy/extend_views/fastlist/PostHandlerView.java +6 -0
  61. package/rules/.source/hippy/extend_views/fastlist/PostTaskHolder.java +20 -0
  62. package/rules/.source/hippy/extend_views/fastlist/ReplaceChildController.java +105 -0
  63. package/rules/.source/hippy/extend_views/fastlist/ReplaceChildView.java +312 -0
  64. package/rules/.source/hippy/extend_views/fastlist/TVListView.java +3692 -0
  65. package/rules/.source/hippy/extend_views/fastlist/TemplateCodeParser.java +247 -0
  66. package/rules/.source/hippy/extend_views/fastlist/Utils.java +572 -0
  67. package/rules/.source/hippy/extend_views/fastlist/ViewTag.java +317 -0
  68. package/rules/.source/hippy/extend_views/fastlist/VirtualListView.java +8 -0
  69. package/rules/.source/hippy/extend_views/fastlist/diff/FastListDataBindingHelper.java +320 -0
  70. package/rules/.source/hippy/extend_views/fastlist/diff/KeyDiffHelper.java +289 -0
  71. package/rules/.source/hippy/extend_views/fastlist/diff/NoKeyDiffHelper.java +278 -0
  72. package/rules/.source/hippy/extend_views/tag/FontTag.java +53 -0
  73. package/rules/.source/hippy/extend_views/tag/HtmlTag.java +191 -0
  74. package/rules/.source/hippy/extend_views/tag/HtmlTagHandler.java +185 -0
  75. package/rules/.source/hippy/extend_views/tag/SpanTag.java +160 -0
  76. package/rules/.source/hippy/extend_views/tag/TextFontSpan.java +102 -0
  77. package/rules/.source/hippy/extend_views/waterfall/Chunk.java +10 -0
  78. package/rules/.source/hippy/extend_views/waterfall/ChunkGroup.java +5 -0
  79. package/rules/.source/hippy/extend_views/waterfall/Section.java +4 -0
  80. package/rules/.source/hippy/extend_views/waterfall/Tabs.java +5 -0
  81. package/rules/.source/hippy/extend_views/waterfall/WaterfallUtils.java +26 -0
  82. package/rules/.source/hippy/hippy_uimanager/ControllerHolder.java +30 -0
  83. package/rules/.source/hippy/hippy_uimanager/ControllerManager.java +651 -0
  84. package/rules/.source/hippy/hippy_uimanager/ControllerRegistry.java +102 -0
  85. package/rules/.source/hippy/hippy_uimanager/ControllerUpdateManger.java +252 -0
  86. package/rules/.source/hippy/hippy_uimanager/CustomControllerHelper.java +425 -0
  87. package/rules/.source/hippy/hippy_uimanager/DiffUtils.java +526 -0
  88. package/rules/.source/hippy/hippy_uimanager/ExtendViewGroup.java +36 -0
  89. package/rules/.source/hippy/hippy_uimanager/HippyCustomViewCreator.java +29 -0
  90. package/rules/.source/hippy/hippy_uimanager/HippyGroupController.java +83 -0
  91. package/rules/.source/hippy/hippy_uimanager/HippyViewBase.java +27 -0
  92. package/rules/.source/hippy/hippy_uimanager/HippyViewController.java +2189 -0
  93. package/rules/.source/hippy/hippy_uimanager/HippyViewEvent.java +52 -0
  94. package/rules/.source/hippy/hippy_uimanager/IHippyZIndexViewGroup.java +24 -0
  95. package/rules/.source/hippy/hippy_uimanager/InternalExtendViewUtil.java +395 -0
  96. package/rules/.source/hippy/hippy_uimanager/ListItemRenderNode.java +143 -0
  97. package/rules/.source/hippy/hippy_uimanager/ListViewRenderNode.java +44 -0
  98. package/rules/.source/hippy/hippy_uimanager/MatrixUtil.java +470 -0
  99. package/rules/.source/hippy/hippy_uimanager/NativeGestureDispatcher.java +349 -0
  100. package/rules/.source/hippy/hippy_uimanager/NativeGestureProcessor.java +188 -0
  101. package/rules/.source/hippy/hippy_uimanager/PullFooterRenderNode.java +43 -0
  102. package/rules/.source/hippy/hippy_uimanager/PullHeaderRenderNode.java +43 -0
  103. package/rules/.source/hippy/hippy_uimanager/RenderManager.java +304 -0
  104. package/rules/.source/hippy/hippy_uimanager/RenderNode.java +533 -0
  105. package/rules/.source/hippy/hippy_uimanager/StateView.java +17 -0
  106. package/rules/.source/hippy/hippy_uimanager/TransformUtil.java +125 -0
  107. package/rules/.source/hippy/hippy_uimanager/ViewGroupDrawingOrderHelper.java +108 -0
  108. package/rules/.source/hippy/hippy_uimanager/ViewStateProvider.java +10 -0
  109. package/rules/.source/hippy/hippy_views/audioview/AudioPlayManager.java +457 -0
  110. package/rules/.source/hippy/hippy_views/audioview/AudioView.java +225 -0
  111. package/rules/.source/hippy/hippy_views/audioview/AudioViewController.java +135 -0
  112. package/rules/.source/hippy/hippy_views/common/CommonBackgroundDrawable.java +58 -0
  113. package/rules/.source/hippy/hippy_views/common/CommonBorder.java +37 -0
  114. package/rules/.source/hippy/hippy_views/custom/HippyCustomPropsController.java +61 -0
  115. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerListAdapter.java +399 -0
  116. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerView.java +378 -0
  117. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewController.java +187 -0
  118. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewHolder.java +39 -0
  119. package/rules/.source/hippy/hippy_views/hippylist/HippyRecyclerViewWrapper.java +134 -0
  120. package/rules/.source/hippy/hippy_views/hippylist/NodePositionHelper.java +55 -0
  121. package/rules/.source/hippy/hippy_views/hippylist/PreloadHelper.java +54 -0
  122. package/rules/.source/hippy/hippy_views/hippylist/PullFooterEventHelper.java +61 -0
  123. package/rules/.source/hippy/hippy_views/hippylist/PullHeaderEventHelper.java +127 -0
  124. package/rules/.source/hippy/hippy_views/hippylist/RecyclerViewEventHelper.java +394 -0
  125. package/rules/.source/hippy/hippy_views/image/HippyContentDrawable.java +113 -0
  126. package/rules/.source/hippy/hippy_views/image/HippyImageView.java +1608 -0
  127. package/rules/.source/hippy/hippy_views/image/HippyImageViewController.java +382 -0
  128. package/rules/.source/hippy/hippy_views/image/IImageStateListener.java +7 -0
  129. package/rules/.source/hippy/hippy_views/list/ChildOnScreenScroller.java +255 -0
  130. package/rules/.source/hippy/hippy_views/list/HippyListAdapter.java +647 -0
  131. package/rules/.source/hippy/hippy_views/list/HippyListItemView.java +162 -0
  132. package/rules/.source/hippy/hippy_views/list/HippyListItemViewController.java +45 -0
  133. package/rules/.source/hippy/hippy_views/list/HippyListView.java +915 -0
  134. package/rules/.source/hippy/hippy_views/list/HippyListViewController.java +622 -0
  135. package/rules/.source/hippy/hippy_views/list/HippyRecycler.java +31 -0
  136. package/rules/.source/hippy/hippy_views/list/IRecycleItemTypeChange.java +23 -0
  137. package/rules/.source/hippy/hippy_views/list/ItemDecorations.java +70 -0
  138. package/rules/.source/hippy/hippy_views/list/NegativeLongKeyFlinger.java +156 -0
  139. package/rules/.source/hippy/hippy_views/list/NodeHolder.java +34 -0
  140. package/rules/.source/hippy/hippy_views/list/RecycleViewFlinger.java +126 -0
  141. package/rules/.source/hippy/hippy_views/list/TVRecyclerView.java +2070 -0
  142. package/rules/.source/hippy/hippy_views/list/TVSingleLineListView.java +15 -0
  143. package/rules/.source/hippy/hippy_views/modal/HippyModalHostManager.java +102 -0
  144. package/rules/.source/hippy/hippy_views/modal/HippyModalHostView.java +597 -0
  145. package/rules/.source/hippy/hippy_views/modal/ModalHostHelper.java +46 -0
  146. package/rules/.source/hippy/hippy_views/modal/ModalStyleNode.java +34 -0
  147. package/rules/.source/hippy/hippy_views/modal/RequestCloseEvent.java +32 -0
  148. package/rules/.source/hippy/hippy_views/modal/ShowEvent.java +31 -0
  149. package/rules/.source/hippy/hippy_views/navigator/Navigator.java +126 -0
  150. package/rules/.source/hippy/hippy_views/navigator/NavigatorController.java +120 -0
  151. package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterView.java +47 -0
  152. package/rules/.source/hippy/hippy_views/refresh/HippyPullFooterViewController.java +65 -0
  153. package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderView.java +39 -0
  154. package/rules/.source/hippy/hippy_views/refresh/HippyPullHeaderViewController.java +104 -0
  155. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapper.java +237 -0
  156. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperController.java +62 -0
  157. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemController.java +39 -0
  158. package/rules/.source/hippy/hippy_views/refresh/RefreshWrapperItemView.java +26 -0
  159. package/rules/.source/hippy/hippy_views/scroll/HippyHorizontalScrollView.java +500 -0
  160. package/rules/.source/hippy/hippy_views/scroll/HippyOnScrollHelper.java +39 -0
  161. package/rules/.source/hippy/hippy_views/scroll/HippyScrollView.java +46 -0
  162. package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewController.java +178 -0
  163. package/rules/.source/hippy/hippy_views/scroll/HippyScrollViewEventHelper.java +92 -0
  164. package/rules/.source/hippy/hippy_views/scroll/HippyVerticalScrollView.java +522 -0
  165. package/rules/.source/hippy/hippy_views/text/HippyTextView.java +512 -0
  166. package/rules/.source/hippy/hippy_views/text/HippyTextViewController.java +77 -0
  167. package/rules/.source/hippy/hippy_views/textinput/HippyTextInput.java +668 -0
  168. package/rules/.source/hippy/hippy_views/textinput/HippyTextInputController.java +528 -0
  169. package/rules/.source/hippy/hippy_views/textinput/TextInputNode.java +115 -0
  170. package/rules/.source/hippy/hippy_views/videoview/APEZProvider.java +287 -0
  171. package/rules/.source/hippy/hippy_views/videoview/APKExpansionSupport.java +82 -0
  172. package/rules/.source/hippy/hippy_views/videoview/PivotPoint.java +13 -0
  173. package/rules/.source/hippy/hippy_views/videoview/ScalableType.java +34 -0
  174. package/rules/.source/hippy/hippy_views/videoview/ScalableVideoView.java +265 -0
  175. package/rules/.source/hippy/hippy_views/videoview/ScaleManager.java +191 -0
  176. package/rules/.source/hippy/hippy_views/videoview/Size.java +19 -0
  177. package/rules/.source/hippy/hippy_views/videoview/VideoHippyView.java +917 -0
  178. package/rules/.source/hippy/hippy_views/videoview/VideoHippyViewController.java +236 -0
  179. package/rules/.source/hippy/hippy_views/videoview/ZipResourceFile.java +427 -0
  180. package/rules/.source/hippy/hippy_views/view/CardRootView.java +28 -0
  181. package/rules/.source/hippy/hippy_views/view/CustomLayoutView.java +10 -0
  182. package/rules/.source/hippy/hippy_views/view/CustomNodeView.java +5 -0
  183. package/rules/.source/hippy/hippy_views/view/DialogViewGroup.java +113 -0
  184. package/rules/.source/hippy/hippy_views/view/HippyViewGroup.java +2042 -0
  185. package/rules/.source/hippy/hippy_views/view/HippyViewGroupController.java +583 -0
  186. package/rules/.source/hippy/hippy_views/view/WindowRoot.java +5 -0
  187. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPager.java +308 -0
  188. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerAdapter.java +148 -0
  189. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerController.java +246 -0
  190. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItem.java +27 -0
  191. package/rules/.source/hippy/hippy_views/viewpager/HippyViewPagerItemController.java +42 -0
  192. package/rules/.source/hippy/hippy_views/viewpager/ViewPagerPageChangeListener.java +114 -0
  193. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageItemExposureEvent.java +40 -0
  194. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollEvent.java +43 -0
  195. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageScrollStateChangedEvent.java +42 -0
  196. package/rules/.source/hippy/hippy_views/viewpager/event/HippyPageSelectedEvent.java +42 -0
  197. package/rules/.source/hippy/hippy_views/webview/HippyWebView.java +160 -0
  198. package/rules/.source/hippy/hippy_views/webview/HippyWebViewBridge.java +20 -0
  199. package/rules/.source/hippy/hippy_views/webview/HippyWebViewController.java +103 -0
  200. package/rules/.source/hippy/hippy_views/webview/HippyWebViewInner.java +77 -0
  201. package/rules/.windsurfrules +27 -4
  202. package/rules/AGENTS.md +27 -4
  203. package/rules/CLAUDE.md +27 -3
  204. package/rules/GEMINI.md +25 -3
@@ -0,0 +1,378 @@
1
+ /* Tencent is pleased to support the open source community by making Hippy available.
2
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package com.tencent.mtt.hippy.views.hippylist;
18
+
19
+ import android.content.Context;
20
+ import android.graphics.Rect;
21
+ import android.support.annotation.NonNull;
22
+ import android.support.annotation.Nullable;
23
+ import android.support.v7.widget.HippyRecyclerViewBase;
24
+ import android.support.v7.widget.IHippyViewAboundListener;
25
+ import android.support.v7.widget.LinearLayoutManager;
26
+ import android.util.AttributeSet;
27
+ import android.view.MotionEvent;
28
+ import android.view.View;
29
+ import android.view.ViewGroup;
30
+ import com.tencent.mtt.hippy.HippyEngineContext;
31
+ import com.tencent.mtt.hippy.utils.LogUtils;
32
+ import com.tencent.mtt.hippy.utils.PixelUtil;
33
+ import com.tencent.mtt.nxeasy.recyclerview.helper.skikcy.IHeaderAttachListener;
34
+ import com.tencent.mtt.nxeasy.recyclerview.helper.skikcy.IHeaderHost;
35
+ import com.tencent.mtt.nxeasy.recyclerview.helper.skikcy.StickyHeaderHelper;
36
+
37
+ public class HippyRecyclerView<ADP extends HippyRecyclerListAdapter> extends HippyRecyclerViewBase
38
+ implements IHeaderAttachListener, IHippyViewAboundListener {
39
+
40
+ protected HippyEngineContext hippyEngineContext;
41
+ protected ADP listAdapter;
42
+ protected boolean isEnableScroll = true; //使能ListView的滚动功能
43
+ protected StickyHeaderHelper stickyHeaderHelper; //支持吸顶
44
+ protected IHeaderHost headerHost; //用于pullHeader下拉刷新
45
+ protected LayoutManager layoutManager;
46
+ protected RecyclerViewEventHelper recyclerViewEventHelper;//事件集合
47
+ private NodePositionHelper nodePositionHelper;
48
+ protected int renderNodeCount = 0;
49
+
50
+ public HippyRecyclerView(Context context) {
51
+ super(context);
52
+ }
53
+
54
+ public HippyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
55
+ super(context, attrs);
56
+ }
57
+
58
+ public HippyRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
59
+ super(context, attrs, defStyle);
60
+ }
61
+
62
+ public ADP getAdapter() {
63
+ return listAdapter;
64
+ }
65
+
66
+ @Override
67
+ public void setAdapter(@Nullable Adapter adapter) {
68
+ listAdapter = (ADP) adapter;
69
+ super.setAdapter(adapter);
70
+ }
71
+
72
+ public NodePositionHelper getNodePositionHelper() {
73
+ if (nodePositionHelper == null) {
74
+ nodePositionHelper = new NodePositionHelper();
75
+ }
76
+ return nodePositionHelper;
77
+ }
78
+
79
+ public void setOrientation(LinearLayoutManager layoutManager) {
80
+ this.layoutManager = layoutManager;
81
+ }
82
+
83
+ public void setHeaderHost(IHeaderHost headerHost) {
84
+ this.headerHost = headerHost;
85
+ }
86
+
87
+ public void setHippyEngineContext(HippyEngineContext hippyEngineContext) {
88
+ this.hippyEngineContext = hippyEngineContext;
89
+ }
90
+
91
+ public void initRecyclerView() {
92
+ setAdapter(new HippyRecyclerListAdapter<HippyRecyclerView>(this, this.hippyEngineContext));
93
+ intEventHelper();
94
+ }
95
+
96
+
97
+ @Override
98
+ public boolean onTouchEvent(MotionEvent e) {
99
+ if (!isEnableScroll) {
100
+ return false;
101
+ }
102
+ return super.onTouchEvent(e);
103
+ }
104
+
105
+ /**
106
+ * 刷新数据
107
+ */
108
+ public void setListData() {
109
+ LogUtils.d("HippyRecyclerView", "itemCount =" + listAdapter.getItemCount());
110
+ listAdapter.notifyDataSetChanged();
111
+ //notifyDataSetChanged 本身是可以触发requestLayout的,但是Hippy框架下 HippyRootView 已经把
112
+ //onLayout方法重载写成空方法,requestLayout不会回调孩子节点的onLayout,这里需要自己发起dispatchLayout
113
+ renderNodeCount = getAdapter().getRenderNodeCount();
114
+ dispatchLayout();
115
+ }
116
+
117
+ /**
118
+ * 内容偏移,返回recyclerView顶部被滑出去的内容 1、找到顶部第一个View前面的逻辑内容高度 2、加上第一个View被遮住的区域
119
+ */
120
+ public int getContentOffsetY() {
121
+ return computeVerticalScrollOffset();
122
+ }
123
+
124
+ /**
125
+ * 内容偏移,返回recyclerView被滑出去的内容 1、找到顶部第一个View前面的逻辑内容宽度 2、加上第一个View被遮住的区域
126
+ */
127
+ public int getContentOffsetX() {
128
+ int firstChildPosition = getFirstChildPosition();
129
+ int totalWidthBeforePosition = getTotalWithBefore(firstChildPosition);
130
+ int firstChildOffset =
131
+ listAdapter.getItemWidth(firstChildPosition) - getVisibleWidth(getChildAt(0));
132
+ return totalWidthBeforePosition + firstChildOffset;
133
+ }
134
+
135
+ /**
136
+ * 获取一个View的可视高度,并非view本身的height,有可能部分是被滑出到屏幕外部
137
+ */
138
+ protected int getVisibleHeight(View firstChildView) {
139
+ return getViewVisibleRect(firstChildView).height();
140
+ }
141
+
142
+ /**
143
+ * 获取一个View的可视高度,并非view本身的height,有可能部分是被滑出到屏幕外部
144
+ */
145
+ protected int getVisibleWidth(View firstChildView) {
146
+ return getViewVisibleRect(firstChildView).width();
147
+ }
148
+
149
+ /**
150
+ * 获取view在父亲中的可视区域
151
+ */
152
+ private Rect getViewVisibleRect(View view) {
153
+ Rect rect = new Rect();
154
+ if (view != null) {
155
+ view.getLocalVisibleRect(rect);
156
+ }
157
+ return rect;
158
+ }
159
+
160
+ /**
161
+ * 获取position 前面的内容高度,不包含position自身的高度
162
+ */
163
+ public int getTotalHeightBefore(int position) {
164
+ int totalHeightBefore = 0;
165
+ for (int i = 0; i < position; i++) {
166
+ totalHeightBefore += listAdapter.getItemHeight(i);
167
+ }
168
+ return totalHeightBefore;
169
+ }
170
+
171
+ /**
172
+ * 获取renderNodePosition前面的内容高度,不包含renderNodePosition自身的高度
173
+ */
174
+ public int getRenderNodeHeightBefore(int renderNodePosition) {
175
+ int renderNodeTotalHeight = 0;
176
+ for (int i = 0; i < renderNodePosition; i++) {
177
+ renderNodeTotalHeight += listAdapter.getRenderNodeHeight(i);
178
+ }
179
+ return renderNodeTotalHeight;
180
+ }
181
+
182
+
183
+ /**
184
+ * 获取position 前面的内容高度,不包含position自身的高度
185
+ */
186
+ public int getTotalWithBefore(int position) {
187
+ int totalWidthBefore = 0;
188
+ for (int i = 0; i < position; i++) {
189
+ totalWidthBefore += listAdapter.getItemWidth(i);
190
+ }
191
+ return totalWidthBefore;
192
+ }
193
+
194
+ public RecyclerViewEventHelper getRecyclerViewEventHelper() {
195
+ return intEventHelper();
196
+ }
197
+
198
+ private RecyclerViewEventHelper intEventHelper() {
199
+ if (recyclerViewEventHelper == null) {
200
+ recyclerViewEventHelper = createEventHelper();
201
+ }
202
+ return recyclerViewEventHelper;
203
+ }
204
+
205
+ protected RecyclerViewEventHelper createEventHelper() {
206
+ return new RecyclerViewEventHelper(this);
207
+ }
208
+
209
+ /**
210
+ * 设置recyclerView可以滚动
211
+ */
212
+ public void setScrollEnable(boolean enable) {
213
+ isEnableScroll = enable;
214
+ }
215
+
216
+ public int getNodePositionInAdapter(int position) {
217
+ return position;
218
+ }
219
+
220
+ public void scrollToIndex(int xIndex, int yPosition, boolean animated, int duration) {
221
+ int positionInAdapter = getNodePositionInAdapter(yPosition);
222
+ if (animated) {
223
+ doSmoothScrollY(duration, getTotalHeightBefore(positionInAdapter) - getContentOffsetY());
224
+ postDispatchLayout();
225
+ } else {
226
+ scrollToPositionWithOffset(positionInAdapter, 0);
227
+ //不能调用postDispatchLayout,需要立即调研dispatchLayout,否则滚动位置不对
228
+ dispatchLayout();
229
+ }
230
+ }
231
+
232
+ /**
233
+ * @param xOffset 暂不支持
234
+ * @param yOffset yOffset>0 内容向上移动,yOffset<0, 内容向下移动
235
+ * @param animated 是否有动画
236
+ * @param duration 动画的时间
237
+ */
238
+ public void scrollToContentOffset(double xOffset, double yOffset, boolean animated,
239
+ int duration) {
240
+ if (!canScrollToContentOffset()) {
241
+ return;
242
+ }
243
+ int yOffsetInPixel = (int) PixelUtil.dp2px(yOffset);
244
+ int deltaY = yOffsetInPixel - getContentOffsetY();
245
+ //增加异常保护
246
+ if (animated) {
247
+ doSmoothScrollY(duration, deltaY);
248
+ } else {
249
+ scrollBy(0, deltaY);
250
+ }
251
+ }
252
+
253
+ /**
254
+ * renderNodeCount是在setListData的时候更新,必须调用setListData后,确保renderNodeCount和
255
+ * getAdapter().getRenderNodeCount()的值相等,才能进行滚动,否则scrollBy会出现IndexOutOfBoundsException
256
+ * 的问题,主要原因就是RecyclerView的内部状态没有通过setListData进行刷新,还是老的数据
257
+ * RenderManager的batch方法应该把dispatchUIFunction放到batchComplete后面,但是这样改动太大
258
+ *
259
+ * @return
260
+ */
261
+ private boolean canScrollToContentOffset() {
262
+ return renderNodeCount == getAdapter().getRenderNodeCount();
263
+ }
264
+
265
+ private void doSmoothScrollY(int duration, int scrollToYPos) {
266
+ if (duration != 0) {
267
+ if (scrollToYPos != 0 && !didStructureChange()) {
268
+ // smoothScrollBy(0, scrollToYPos, null, duration);
269
+ //FIXME 这里由于改成supportV4 导致duration不支持
270
+ smoothScrollBy(0, scrollToYPos);
271
+ postDispatchLayout();
272
+ }
273
+ } else {
274
+ //smoothScrollBy(0, scrollToYPos);
275
+ scrollBy(0,scrollToYPos);
276
+ postDispatchLayout();
277
+ }
278
+ }
279
+
280
+ private void postDispatchLayout() {
281
+ post(new Runnable() {
282
+ @Override
283
+ public void run() {
284
+ dispatchLayout();
285
+ }
286
+ });
287
+ }
288
+
289
+ public void scrollToTop() {
290
+ LayoutManager layoutManager = getLayoutManager();
291
+ if (layoutManager.canScrollHorizontally()) {
292
+ smoothScrollBy(-getContentOffsetX(), 0);
293
+ } else {
294
+ smoothScrollBy(0, -getContentOffsetY());
295
+ }
296
+ postDispatchLayout();
297
+ }
298
+
299
+ /**
300
+ * @param enable true :支持Item 上滑吸顶功能
301
+ */
302
+ public void setRowShouldSticky(boolean enable) {
303
+ if (enable) {
304
+ if (stickyHeaderHelper == null) {
305
+ stickyHeaderHelper = new StickyHeaderHelper(this, listAdapter, this, headerHost);
306
+ addOnScrollListener(stickyHeaderHelper);
307
+ }
308
+ } else {
309
+ if (stickyHeaderHelper != null) {
310
+ removeOnScrollListener(stickyHeaderHelper);
311
+ }
312
+ }
313
+ }
314
+
315
+ /**
316
+ * 同步删除RenderNode对应注册的View,deleteChild是递归删除RenderNode创建的所有的view
317
+ */
318
+ @Override
319
+ public void onViewAbound(HippyRecyclerViewHolder viewHolder) {
320
+ if (viewHolder.bindNode != null && !viewHolder.bindNode.isDelete()) {
321
+ getAdapter().deleteExistRenderView(viewHolder.bindNode);
322
+ }
323
+ }
324
+
325
+ /**
326
+ * 当header被摘下来,需要对header进行还原或者回收对处理 遍历所有都ViewHolder,看看有没有收纳这个headerView都ViewHolder
327
+ * 如果没有,需要把aboundHeader进行回收,并同步删除render节点对应都view
328
+ *
329
+ * @param aboundHeader HeaderView对应的Holder
330
+ * @param currentHeaderView headerView的实体内容
331
+ */
332
+ @Override
333
+ public void onHeaderDetached(ViewHolder aboundHeader, View currentHeaderView) {
334
+ boolean findHostViewHolder = false;
335
+ for (int i = 0; i < getChildCountWithCaches(); i++) {
336
+ ViewHolder viewHolder = getChildViewHolder(getChildAtWithCaches(i));
337
+ if (isTheSameRenderNode((HippyRecyclerViewHolder) aboundHeader,
338
+ (HippyRecyclerViewHolder) viewHolder)) {
339
+ findHostViewHolder = true;
340
+ fillContentView(currentHeaderView, viewHolder);
341
+ break;
342
+ }
343
+ }
344
+ //当header无处安放,抛弃view都同时,需要同步给Hippy进行View都删除,不然后续无法创建对应都View
345
+ if (!findHostViewHolder) {
346
+ onViewAbound((HippyRecyclerViewHolder) aboundHeader);
347
+ }
348
+ }
349
+
350
+ private boolean fillContentView(View currentHeaderView, ViewHolder viewHolder) {
351
+ if (viewHolder != null && viewHolder.itemView instanceof ViewGroup) {
352
+ ViewGroup itemView = (ViewGroup) viewHolder.itemView;
353
+ if (itemView.getChildCount() <= 0) {
354
+ itemView.addView(currentHeaderView);
355
+ }
356
+ }
357
+ return false;
358
+ }
359
+
360
+ private boolean isTheSameRenderNode(HippyRecyclerViewHolder aboundHeader,
361
+ HippyRecyclerViewHolder viewHolder) {
362
+ if (viewHolder.bindNode != null && aboundHeader.bindNode != null) {
363
+ return viewHolder.bindNode.getId() == aboundHeader.bindNode.getId();
364
+ }
365
+ return false;
366
+ }
367
+
368
+ public void setNodePositionHelper(NodePositionHelper nodePositionHelper) {
369
+ this.nodePositionHelper = nodePositionHelper;
370
+ }
371
+
372
+ @Override
373
+ public String toString() {
374
+ return this.getClass().getSimpleName() + "{renderNodeCount:" + renderNodeCount + ",state:"
375
+ + getStateInfo()
376
+ + "}";
377
+ }
378
+ }
@@ -0,0 +1,187 @@
1
+ /* Tencent is pleased to support the open source community by making Hippy available.
2
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package com.tencent.mtt.hippy.views.hippylist;
18
+
19
+ import android.content.Context;
20
+ import android.support.v7.widget.EasyLinearLayoutManager;
21
+ import android.support.v7.widget.LinearLayoutManager;
22
+ import android.view.View;
23
+ import com.tencent.mtt.hippy.HippyInstanceContext;
24
+ import com.tencent.mtt.hippy.HippyRootView;
25
+ import com.tencent.mtt.hippy.annotation.HippyController;
26
+ import com.tencent.mtt.hippy.annotation.HippyControllerProps;
27
+ import com.tencent.mtt.hippy.common.HippyArray;
28
+ import com.tencent.mtt.hippy.common.HippyMap;
29
+ import com.tencent.mtt.hippy.uimanager.ControllerManager;
30
+ import com.tencent.mtt.hippy.uimanager.HippyViewController;
31
+ import com.tencent.mtt.hippy.uimanager.ListViewRenderNode;
32
+ import com.tencent.mtt.hippy.uimanager.RenderNode;
33
+
34
+ @HippyController(name = HippyRecyclerViewController.CLASS_NAME)
35
+ public class HippyRecyclerViewController<HRW extends HippyRecyclerViewWrapper> extends
36
+ HippyViewController<HRW> {
37
+
38
+ public static final String CLASS_NAME = "RecyclerView";
39
+ public static final String SCROLL_TO_INDEX = "scrollToIndex";
40
+ public static final String SCROLL_TO_CONTENT_OFFSET = "scrollToContentOffset";
41
+ public static final String SCROLL_TO_TOP = "scrollToTop";
42
+ public static final String COLLAPSE_PULL_HEADER = "collapsePullHeader";
43
+ public static final String EXPAND_PULL_HEADER = "expandPullHeader";
44
+
45
+ public HippyRecyclerViewController() {
46
+
47
+ }
48
+
49
+ @Override
50
+ public int getChildCount(HRW viewGroup) {
51
+ return viewGroup.getChildCountWithCaches();
52
+ }
53
+
54
+ @Override
55
+ public View getChildAt(HRW viewGroup, int index) {
56
+ return viewGroup.getChildAtWithCaches(index);
57
+ }
58
+
59
+ @Override
60
+ public void onBatchComplete(HRW view) {
61
+ super.onBatchComplete(view);
62
+ view.setListData();
63
+ }
64
+
65
+ @Override
66
+ protected View createViewImpl(Context context) {
67
+ return createViewImpl(context, null);
68
+ }
69
+
70
+ @Override
71
+ protected View createViewImpl(Context context, HippyMap iniProps) {
72
+ return new HippyRecyclerViewWrapper(context,
73
+ initDefault(context, iniProps, new HippyRecyclerView(context)));
74
+ }
75
+
76
+ public static HippyRecyclerView initDefault(Context context, HippyMap iniProps,
77
+ HippyRecyclerView recyclerView) {
78
+ LinearLayoutManager layoutManager = new EasyLinearLayoutManager(context);
79
+ recyclerView.setItemAnimator(null);
80
+ if (iniProps != null && iniProps.containsKey("horizontal")) {
81
+ layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
82
+ }
83
+ recyclerView.setLayoutManager(layoutManager);
84
+ recyclerView.setHippyEngineContext(((HippyInstanceContext) context).getEngineContext());
85
+ recyclerView.initRecyclerView();
86
+ return recyclerView;
87
+ }
88
+
89
+ @Override
90
+ public RenderNode createRenderNode(int id, HippyMap props, String className,
91
+ HippyRootView hippyRootView,
92
+ ControllerManager controllerManager,
93
+ boolean lazy) {
94
+ return new ListViewRenderNode(id, props, className, hippyRootView, controllerManager, lazy);
95
+ }
96
+
97
+ @HippyControllerProps(name = "rowShouldSticky")
98
+ public void setRowShouldSticky(HRW view, boolean enable) {
99
+ view.setRowShouldSticky(enable);
100
+ }
101
+
102
+ @HippyControllerProps(name = "onScrollBeginDrag", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = false)
103
+ public void setScrollBeginDragEventEnable(HRW view, boolean flag) {
104
+ view.getRecyclerViewEventHelper().setScrollBeginDragEventEnable(flag);
105
+ }
106
+
107
+ @HippyControllerProps(name = "onScrollEndDrag", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = false)
108
+ public void setScrollEndDragEventEnable(HRW view, boolean flag) {
109
+ view.getRecyclerViewEventHelper().setScrollEndDragEventEnable(flag);
110
+ }
111
+
112
+ @HippyControllerProps(name = "onMomentumScrollBegin", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = false)
113
+ public void setMomentumScrollBeginEventEnable(HRW view, boolean flag) {
114
+ view.getRecyclerViewEventHelper().setMomentumScrollBeginEventEnable(flag);
115
+ }
116
+
117
+ @HippyControllerProps(name = "onMomentumScrollEnd", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = false)
118
+ public void setMomentumScrollEndEventEnable(HRW view, boolean flag) {
119
+ view.getRecyclerViewEventHelper().setMomentumScrollEndEventEnable(flag);
120
+ }
121
+
122
+ @HippyControllerProps(name = "onScrollEnable", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = false)
123
+ public void setOnScrollEventEnable(HRW view, boolean flag) {
124
+ view.getRecyclerViewEventHelper().setOnScrollEventEnable(flag);
125
+ }
126
+
127
+ @HippyControllerProps(name = "exposureEventEnabled", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = false)
128
+ public void setExposureEventEnable(HRW view, boolean flag) {
129
+ view.getRecyclerViewEventHelper().setExposureEventEnable(flag);
130
+ }
131
+
132
+ @HippyControllerProps(name = "scrollEnabled", defaultType = HippyControllerProps.BOOLEAN, defaultBoolean = true)
133
+ public void setScrollEnable(HRW view, boolean flag) {
134
+ view.setScrollEnable(flag);
135
+ }
136
+
137
+ @HippyControllerProps(name = "scrollEventThrottle", defaultType = HippyControllerProps.NUMBER, defaultNumber = 30.0D)
138
+ public void setscrollEventThrottle(HRW view, int scrollEventThrottle) {
139
+ view.getRecyclerViewEventHelper().setScrollEventThrottle(scrollEventThrottle);
140
+ }
141
+
142
+ @HippyControllerProps(name = "preloadItemNumber")
143
+ public void setPreloadItemNumber(HRW view, int preloadItemNumber) {
144
+ getAdapter(view).setPreloadItemNumber(preloadItemNumber);
145
+ }
146
+
147
+ @Override
148
+ public void dispatchFunction(HRW view, String functionName, HippyArray dataArray) {
149
+ super.dispatchFunction(view, functionName, dataArray);
150
+ switch (functionName) {
151
+ case SCROLL_TO_INDEX: {
152
+ // list滑动到某个item
153
+ int xIndex = dataArray.getInt(0);
154
+ int yIndex = dataArray.getInt(1);
155
+ boolean animated = dataArray.getBoolean(2);
156
+ int duration = dataArray.getInt(3); //1.2.7 增加滚动时间 ms,animated==true时生效
157
+ view.scrollToIndex(xIndex, yIndex, animated, duration);
158
+ break;
159
+ }
160
+ case SCROLL_TO_CONTENT_OFFSET: {
161
+ // list滑动到某个距离
162
+ double xOffset = dataArray.getDouble(0);
163
+ double yOffset = dataArray.getDouble(1);
164
+ boolean animated = dataArray.getBoolean(2);
165
+ int duration = dataArray.getInt(3); //1.2.7 增加滚动时间 ms,animated==true时生效
166
+ view.scrollToContentOffset(xOffset, yOffset, animated, duration);
167
+ break;
168
+ }
169
+ case SCROLL_TO_TOP: {
170
+ view.scrollToTop();
171
+ break;
172
+ }
173
+ case COLLAPSE_PULL_HEADER: {
174
+ getAdapter(view).getHeaderEventHelper().onHeaderRefreshFinish();
175
+ break;
176
+ }
177
+ case EXPAND_PULL_HEADER: {
178
+ getAdapter(view).getHeaderEventHelper().onHeaderRefresh();
179
+ break;
180
+ }
181
+ }
182
+ }
183
+
184
+ private HippyRecyclerListAdapter getAdapter(HRW view) {
185
+ return view.getRecyclerView().getAdapter();
186
+ }
187
+ }
@@ -0,0 +1,39 @@
1
+ /* Tencent is pleased to support the open source community by making Hippy available.
2
+ * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package com.tencent.mtt.hippy.views.hippylist;
18
+
19
+ import android.support.annotation.NonNull;
20
+ import android.support.v7.widget.RecyclerView.ViewHolder;
21
+ import android.view.View;
22
+ import com.tencent.mtt.hippy.uimanager.ListItemRenderNode;
23
+
24
+ public class HippyRecyclerViewHolder extends ViewHolder {
25
+
26
+ public ListItemRenderNode bindNode;
27
+
28
+ public HippyRecyclerViewHolder(@NonNull View itemView, ListItemRenderNode renderNode) {
29
+ super(itemView);
30
+ bindNode = renderNode;
31
+ }
32
+
33
+ public boolean isRenderDeleted() {
34
+ if (bindNode != null) {
35
+ return bindNode.isDelete();
36
+ }
37
+ return false;
38
+ }
39
+ }