wangliang_wd

feat:优化人民号刷新问题

... ... @@ -2,6 +2,8 @@ import { PeopleShipRecommendComponent } from './PeopleShipRecommendComponent';
import { PeopleShipMainViewModel } from '../../viewmodel/PeopleShipMainViewModel';
import { HttpUtils } from 'wdNetwork/Index';
import { Logger, DateTimeUtils, EmitterEventId, EmitterUtils } from 'wdKit';
import { autoRefresh, onActionEnd, onActionStart, onActionUpdate,closeRefresh } from '../../utils/NewPullDownRefresh';
import {
RmhRecommendDTO,
ContentDTO,
... ... @@ -27,6 +29,12 @@ import { PeopleShipNoMoreData } from '../reusable/PeopleShipNoMoreData';
import PageFollowHelper from '../../viewmodel/PageFollowHelper';
import { MineFollowListItem } from '../../viewmodel/MineFollowListItem';
import { GrayManageModel } from '../../viewmodel/GrayManageModel';
import RefreshLayout from '../refresh/RefreshLayout';
import { RefreshLayoutBean } from '../refresh/RefreshLayoutBean';
import { CommonConstants } from 'wdConstant';
import PageNoMoreLayout from '../page/PageNoMoreLayout';
import LoadMoreLayout from '../page/LoadMoreLayout';
import { NoMoreBean } from '../page/NoMoreBean';
const TAG = 'PeopleShipMainComponent';
... ... @@ -63,8 +71,21 @@ export struct PeopleShipMainComponent {
@State private pageAttentionChange: boolean = false
// 国殇灰度管理
GrayManage: SubscribedAbstractProperty<GrayManageModel> = AppStorage.link<GrayManageModel>('GrayManage')
private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Up | PanDirection.Down })
///刷新请求
onRefresh: () => void = () => {
this.currentPage = 1
this.getData()
}
onRefreshMore: () => void = () => {
this.currentPage++;
this.getAttentionContentListData()
}
build() {
Column(){
if (this.viewType == ViewType.LOADING) {
this.LoadingLayout()
} else if (this.viewType == ViewType.ERROR) {
... ... @@ -87,52 +108,96 @@ export struct PeopleShipMainComponent {
}
})
.grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
} else {
}else {
if (this.followList.length == 0) {
CustomPullToRefresh({
alldata: this.rmhList,
scroller: this.listScroller,
hasMore: false,
customList: () => {
this.ListLayout()
},
onRefresh: (resolve) => {
this.currentPage = 1
this.getData(resolve)
},
})
} else {
CustomPullToRefresh({
alldata: this.attentionList,
scroller: this.listScroller,
hasMore: this.hasMore,
customList: () => {
this.ListAttentionLayout()
},
onRefresh: (resolve) => {
this.currentPage = 1
this.getData(resolve)
},
onLoadMore: (resolve) => {
if (this.hasMore === false) {
if (resolve) {
resolve('')
}
return
}
if (!this.isLoading && this.hasMore) {
//加载分页数据
this.currentPage++;
this.getAttentionContentListData(resolve)
} else {
if (resolve) {
resolve('')
}
}
},
.parallelGesture(
PanGesture(this.panOption)
.onActionStart((event?: GestureEvent) => {
this.pageModel.isVisiblePullDown = true
onActionStart(this.pageModel, event)
})
}
}
.onActionUpdate((event?: GestureEvent) => {
onActionUpdate(this.pageModel, event,this.onRefreshMore)
})
.onActionEnd(() => {
onActionEnd(this.pageModel,this.onRefresh)
})
)
// if (this.viewType == ViewType.LOADING) {
// this.LoadingLayout()
// } else if (this.viewType == ViewType.ERROR) {
// //缺省页
// EmptyComponent({
// emptyType: this.pageModel.emptyType,
// emptyButton: true,
// retry: () => {
// this.getData()
// }
// })
// .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
// } else if (this.viewType == ViewType.EMPTY) {
// //缺省页
// EmptyComponent({
// emptyType: this.pageModel.emptyType,
// emptyButton: true,
// retry: () => {
// this.getData()
// }
// })
// .grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
// } else {
// if (this.followList.length == 0) {
// CustomPullToRefresh({
// alldata: this.rmhList,
// scroller: this.listScroller,
// hasMore: false,
// customList: () => {
// this.ListLayout()
// },
// onRefresh: (resolve) => {
// this.currentPage = 1
// this.getData(resolve)
// },
// })
// } else {
// CustomPullToRefresh({
// alldata: this.attentionList,
// scroller: this.listScroller,
// hasMore: this.hasMore,
// customList: () => {
// this.ListAttentionLayout()
// },
// onRefresh: (resolve) => {
// this.currentPage = 1
// this.getData(resolve)
// },
// onLoadMore: (resolve) => {
// if (this.hasMore === false) {
// if (resolve) {
// resolve('')
// }
// return
// }
// if (!this.isLoading && this.hasMore) {
// //加载分页数据
// this.currentPage++;
// this.getAttentionContentListData(resolve)
// } else {
// if (resolve) {
// resolve('')
// }
// }
// },
// })
// }
// }
}
@Builder
... ... @@ -145,6 +210,14 @@ export struct PeopleShipMainComponent {
ListLayout() {
List({ scroller: this.listScroller }) {
ListItem() {
RefreshLayout({
refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullDown, this.pageModel.load,
this.pageModel.offsetY)
})
}
.grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
// 头部关注列表
ListItem() {
PeopleShipRecommendComponent({
... ... @@ -164,7 +237,15 @@ export struct PeopleShipMainComponent {
@Builder
ListAttentionLayout() {
List({ scroller: this.listScroller }) {
// 头部关注列表
ListItem() {
RefreshLayout({
refreshBean: new RefreshLayoutBean(this.pageModel.isVisiblePullDown, this.pageModel.load,
this.pageModel.offsetY)
})
}
.grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
// // 头部关注列表
ListItem() {
PeopleShipAttentionContentListTopComponent({
followList: this.followList
... ... @@ -185,10 +266,18 @@ export struct PeopleShipMainComponent {
}, (item: ContentDTO, index: number) => item.objectId + index.toString())
// // 加载更多
// ListItem() {
// if (!this.hasMore && !this.isLoading) {
// PeopleShipNoMoreData()
// }
// }
// 加载更多
ListItem() {
if (!this.hasMore && !this.isLoading) {
PeopleShipNoMoreData()
if (this.pageModel.hasMore) {
LoadMoreLayout({ isVisible: this.pageModel.isVisiblePullUpLoad })
} else {
PageNoMoreLayout({ noMoreBean: new NoMoreBean(this.pageModel.pageInfo.baselineCopywriting) })
}
}
.grayscale(this.GrayManage.get().isRmhMourning(`${this.channelId}`) ? 1 : 0)
... ... @@ -197,6 +286,12 @@ export struct PeopleShipMainComponent {
.scrollBar(BarState.Off)
.width('100%')
.height('100%')
.onScrollIndex((start: number, end: number) => {
// Listen to the first index of the current list.
this.pageModel.startIndex = start;
// 包含了 头尾item,判断时需要考虑+3
this.pageModel.endIndex = end - 2;
})
}
aboutToAppear() {
... ... @@ -271,10 +366,12 @@ export struct PeopleShipMainComponent {
if (resolve) {
resolve('已更新至最新')
}
this.closeRefresh(true)
} catch (exception) {
if (resolve) {
resolve('')
}
this.closeRefresh(false)
this.viewType = ViewType.ERROR
this.changeButton = false
this.isLoading = false
... ... @@ -297,14 +394,17 @@ export struct PeopleShipMainComponent {
if (listData && listData.list && listData.list.length > 0) {
if (listData.list.length === 20) {
this.hasMore = true;
this.pageModel.hasMore = true
} else {
this.hasMore = false;
this.pageModel.hasMore = false
}
//批量查询各类型内容动态数据接口
this.checkContentInteractData(listData.list, resolve,myFollowInfor)
} else {
this.hasMore = false;
this.pageModel.hasMore = false
this.resolveEnd(true, resolve)
}
... ... @@ -362,8 +462,11 @@ export struct PeopleShipMainComponent {
this.attentionList[i].isMourning = true;
}
}
this.pageModel.compList.clear()
this.pageModel.compList.push(...this.attentionList)
this.closeRefresh(true)
} catch (exception) {
this.closeRefresh(false)
this.resolveEnd(false, resolve)
}
}
... ... @@ -455,7 +558,11 @@ export struct PeopleShipMainComponent {
// 当前页面,自动刷新数据
Logger.debug(TAG, 'page onAutoRefresh ' + this.autoRefresh)
this.listScroller.scrollToIndex(0)
this.currentPage = 1
this.getData()
autoRefresh(this.pageModel,this.onRefresh)
}
closeRefresh(isRefreshSuccess:boolean){
closeRefresh(this.pageModel,isRefreshSuccess)
}
}
\ No newline at end of file
... ...
import { RefreshConstants as Const, RefreshState } from './RefreshConstants';
import { touchMoveLoadMore, touchUpLoadMore } from './NewPullUpLoadMore';
import PageModel from '../viewmodel/PageModel';
import newPageHelper from '../viewmodel/NewPageHelper';
import { LoadStatus } from '../components/refresh/RefreshLayoutBean';
import { Logger } from 'wdKit/Index';
const TAG = 'NewPullDownRefresh'
/***********新的下拉、上拉手势 start **********/
export function onActionStart(pageModel: PageModel, event?: GestureEvent) {
if (event === undefined) {
return
}
pageModel.downY = event.offsetY;
pageModel.lastMoveY = event.offsetY;
}
export function onActionUpdate(pageModel: PageModel, event?: GestureEvent,onRefreshMore: () => void = () => {
}) {
if (event === undefined) {
return
}
if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
return;
}
let isDownPull = event.offsetY - pageModel.lastMoveY > 0;
if (((isDownPull === true) || (pageModel.isPullRefreshOperation === true)) &&
(pageModel.isCanLoadMore === false)) {
actionUpdatePullRefresh(pageModel, event);
} else {
actionUpdateLoadMore(pageModel, event,onRefreshMore);
}
pageModel.lastMoveY = event.offsetY;
}
export function onActionEnd(pageModel: PageModel,onRefresh: () => void = () => {
}) {
if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
return;
}
if ((pageModel.isPullRefreshOperation === true)) {
touchUpPullRefresh(pageModel,onRefresh);
} else {
// touchUpLoadMore(pageModel);
}
}
export function actionUpdatePullRefresh(pageModel: PageModel, event: GestureEvent) {
if (pageModel.startIndex === 0) {
pageModel.isPullRefreshOperation = true;
let height = vp2px(Const.CUSTOM_REFRESH_DECIDE_HEIGHT);
pageModel.offsetY = event.offsetY - pageModel.downY;
if (pageModel.offsetY >= height) {
pullRefreshState(pageModel, RefreshState.Release);
pageModel.offsetY = height + pageModel.offsetY * Const.Y_OFF_SET_COEFFICIENT;
} else {
pullRefreshState(pageModel, RefreshState.DropDown);
}
if (pageModel.offsetY < 0) {
pageModel.offsetY = 0;
pageModel.isPullRefreshOperation = false;
}
}
}
export function actionUpdateLoadMore(model: PageModel, event: GestureEvent,onRefreshMore: () => void = () => {
}) {
// list size +1
if (model.endIndex >= model.compList.totalCount() - 3 && model.endIndex <= model.compList.totalCount()) {
// 不用分页动画,直接预加载
model.isCanLoadMore = true;
model.isVisiblePullUpLoad = true;
touchUpLoadMore(model,onRefreshMore);
}
}
/***********新的下拉、上拉手势 end **********/
//下拉刷新上拉加载更多组件
/**
* @deprecated
*/
export function listTouchEvent(pageModel: PageModel, event: TouchEvent) {
switch (event.type) {
case TouchType.Down:
pageModel.downY = event.touches[0].y;
pageModel.lastMoveY = event.touches[0].y;
break;
case TouchType.Move:
if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
return;
}
let isDownPull = event.touches[0].y - pageModel.lastMoveY > 0;
if (((isDownPull === true) || (pageModel.isPullRefreshOperation === true)) &&
(pageModel.isCanLoadMore === false)) {
// Finger movement, processing pull-down refresh.
touchMovePullRefresh(pageModel, event);
} else {
// Finger movement, processing load more.
touchMoveLoadMore(pageModel, event);
}
pageModel.lastMoveY = event.touches[0].y;
break;
case TouchType.Cancel:
break;
case TouchType.Up:
if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
return;
}
if ((pageModel.isPullRefreshOperation === true)) {
// Lift your finger and pull down to refresh.
touchUpPullRefresh(pageModel);
} else {
// Fingers up, handle loading more.
// touchUpLoadMore(pageModel);
}
break;
default:
break;
}
}
/**
* @deprecated
*/
export function touchMovePullRefresh(pageModel: PageModel, event: TouchEvent) {
if (pageModel.startIndex === 0) {
pageModel.isPullRefreshOperation = true;
let height = vp2px(Const.CUSTOM_REFRESH_DECIDE_HEIGHT);
pageModel.offsetY = event.touches[0].y - pageModel.downY;
// The sliding offset is greater than the pull-down refresh layout height, and the refresh condition is met.
if (pageModel.offsetY >= height) {
pullRefreshState(pageModel, RefreshState.Release);
pageModel.offsetY = height + pageModel.offsetY * Const.Y_OFF_SET_COEFFICIENT;
} else {
pullRefreshState(pageModel, RefreshState.DropDown);
}
if (pageModel.offsetY < 0) {
pageModel.offsetY = 0;
pageModel.isPullRefreshOperation = false;
}
}
}
export function touchUpPullRefresh(pageModel: PageModel,onRefresh: () => void = () => {
}) {
if (pageModel.isCanRefresh === true) {
pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
pullRefreshState(pageModel, RefreshState.Refreshing);
pageModel.currentPage = 1;
setTimeout(() => {
let self: PageModel = pageModel;
newPageHelper.refreshUI(self,onRefresh)
}, Const.DELAY_TIME);
setRefreshTimeoutTimer(pageModel)
} else {
closeRefresh(pageModel, false);
}
}
export function setRefreshTimeoutTimer(pageModel: PageModel) {
let timeoutId = setTimeout(() => {
closeRefresh(pageModel, false);
Logger.error(TAG, 'closeRefresh by timeout')
}, Const.REFRESH_TIMEOUT__TIME);
// 取消超时关闭定时器
clearTimeout(pageModel.refreshTimeoutTimerId)
pageModel.refreshTimeoutTimerId = timeoutId
}
/**
* 自动刷新接口,如首页底导,双击按钮自动刷新
* @param pageModel 页面数据
* @param pageAdvModel 广告数据
*/
export function autoRefresh(pageModel: PageModel,onRefresh: () => void = () => {
}) {
if (pageModel.isRefreshing === true) {
// 拦截多次刷新
return
}
pageModel.isVisiblePullDown = true;
pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
pullRefreshState(pageModel, RefreshState.Refreshing);
pageModel.currentPage = 1;
newPageHelper.refreshUI(pageModel,onRefresh)
setRefreshTimeoutTimer(pageModel)
}
export function pullRefreshState(pageModel: PageModel, state: number) {
switch (state) {
case RefreshState.DropDown:
pageModel.pullDownRefreshText = $r('app.string.pull_down_refresh_text');
pageModel.pullDownRefreshImage = $r('app.media.ic_pull_down_refresh');
pageModel.isCanRefresh = false;
pageModel.isRefreshing = false;
pageModel.isVisiblePullDown = true;
pageModel.load = LoadStatus.PRELOAD
break;
case RefreshState.Release:
pageModel.pullDownRefreshText = $r('app.string.release_refresh_text');
pageModel.pullDownRefreshImage = $r('app.media.ic_pull_up_refresh');
pageModel.isCanRefresh = true;
pageModel.isRefreshing = false;
pageModel.load = LoadStatus.PRELOAD
break;
case RefreshState.Refreshing:
pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
pageModel.pullDownRefreshText = $r('app.string.refreshing_text');
pageModel.pullDownRefreshImage = $r('app.media.ic_pull_up_load');
pageModel.isCanRefresh = true;
pageModel.isRefreshing = true;
pageModel.load = LoadStatus.LOADING
break;
case RefreshState.Success:
pageModel.pullDownRefreshText = $r('app.string.refresh_success_text');
pageModel.pullDownRefreshImage = $r('app.media.ic_succeed_refresh');
pageModel.isCanRefresh = true;
pageModel.isRefreshing = true;
pageModel.load = LoadStatus.LOADED
break;
case RefreshState.Fail:
pageModel.pullDownRefreshText = $r('app.string.refresh_fail_text');
pageModel.pullDownRefreshImage = $r('app.media.ic_fail_refresh');
pageModel.isCanRefresh = true;
pageModel.isRefreshing = true;
pageModel.load = LoadStatus.LOADED
break;
default:
break;
}
}
export function closeRefresh(pageModel: PageModel, isRefreshSuccess: boolean) {
let self = pageModel;
// 取消超时关闭定时器
clearTimeout(self.refreshTimeoutTimerId)
setTimeout(() => {
let delay = Const.RefreshConstant_DELAY_PULL_DOWN_REFRESH;
if (self.isCanRefresh === true) {
pullRefreshState(pageModel, isRefreshSuccess ? RefreshState.Success : RefreshState.Fail);
delay = Const.RefreshConstant_DELAY_SHRINK_ANIMATION_TIME;
}
animateTo({
duration: Const.RefreshConstant_CLOSE_PULL_DOWN_REFRESH_TIME,
delay: delay,
onFinish: () => {
pullRefreshState(pageModel, RefreshState.DropDown);
self.isVisiblePullDown = false;
self.isPullRefreshOperation = false;
}
}, () => {
self.offsetY = 0;
})
}, self.isCanRefresh ? Const.DELAY_ANIMATION_DURATION : 0);
}
\ No newline at end of file
... ...
import PageModel from '../viewmodel/PageModel';
import { RefreshConstants as Const } from './RefreshConstants';
import newPageHelper from '../viewmodel/NewPageHelper';
import { Logger } from 'wdKit/Index';
const TAG = 'NewPullUpLoadMore'
export function touchMoveLoadMore(model: PageModel, event: TouchEvent) {
// list size +1
if (model.endIndex >= model.compList.totalCount() - 3 && model.endIndex <= model.compList.totalCount()) {
// model.offsetY = event.touches[0].y - model.downY;
// if (Math.abs(model.offsetY) > vp2px(model.pullUpLoadHeight) / 2) {
// model.isCanLoadMore = true;
// model.isVisiblePullUpLoad = true;
// model.offsetY = -vp2px(model.pullUpLoadHeight) + model.offsetY * Const.Y_OFF_SET_COEFFICIENT;
// }
// 不用分页动画,直接预加载
model.isCanLoadMore = true;
model.isVisiblePullUpLoad = true;
touchUpLoadMore(model);
}
}
export function touchUpLoadMore(model: PageModel,onRefreshMore: () => void = () => {
}) {
let self: PageModel = model;
animateTo({
duration: Const.ANIMATION_DURATION,
}, () => {
self.offsetY = 0;
})
if ((self.isCanLoadMore === true) && (self.hasMore === true) && (self.isLoading === false)) {
self.isLoading = true;
setTimeout(() => {
// closeLoadMore(model);
// newPageHelper.loadMore(self)
onRefreshMore()
}, Const.DELAY_TIME);
setLoadMoreTimeoutTimer(self)
} else {
closeLoadMore(self);
}
}
export function closeLoadMore(model: PageModel) {
model.isCanLoadMore = false;
model.isLoading = false;
model.isVisiblePullUpLoad = false;
}
export function setLoadMoreTimeoutTimer(pageModel: PageModel) {
let timeoutId = setTimeout(() => {
closeLoadMore(pageModel);
Logger.error(TAG, 'closeLoadMore by timeout')
}, Const.REFRESH_TIMEOUT__TIME);
// 取消超时关闭定时器
clearTimeout(pageModel.loadMoreTimeoutTimerId)
pageModel.loadMoreTimeoutTimerId = timeoutId
}
\ No newline at end of file
... ...
import { CompDTO, ContentDTO, InteractDataDTO, LiveReviewDTO, LiveRoomDataBean, PageDTO, PageInfoDTO } from 'wdBean';
import { CompStyle, ViewType } from 'wdConstant/Index';
import { CollectionUtils, DateTimeUtils, LazyDataSource, Logger, NetworkUtil, StringUtils, ToastUtils } from 'wdKit';
import { closeRefresh } from '../utils/NewPullDownRefresh';
import PageModel from './PageModel';
import PageViewModel from './PageViewModel';
import { promptAction } from '@kit.ArkUI';
import { CompAdvBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';
// import PageAdModel from './PageAdvModel';
import { ArrayList } from '@kit.ArkTS';
import { WDViewDefaultType } from '../components/view/EmptyComponent';
import { CompAdvMatInfoBean } from 'wdBean/src/main/ets/bean/adv/CompAdvInfoBean';
import { BaseDTO } from 'wdBean/src/main/ets/bean/component/BaseDTO';
import { viewBlogInsightIntentShare, ActionMode } from '../utils/InsightIntentShare'
import { common } from '@kit.AbilityKit';
import { CacheData } from 'wdNetwork/Index';
import { closeLoadMore } from '../utils/PullUpLoadMore';
const TAG = 'PageHelper';
// 本地的一行两图卡 style值
const OneRowDoubleColumnStyle = CompStyle.Card_Comp_Zh_Grid_Layout_02
const Normal_Page_Size = 20 // 常规每页数量
const Rec_Page_Size = 10 // 推荐每页数量
const SpecialComp: string[] = [CompStyle.Zh_Single_Column_03.toString()]
/**
* 处理返回后的数据
*/
export class NewPageHelper {
/**
* 刷新数据
*/
async refreshUI(pageModel: PageModel, onRefresh: () => void = () => {
}) {
let netStatus = NetworkUtil.isNetConnected()
if (!netStatus) {
ToastUtils.showToast('网络出小差了,请检查网络后重试', 1000)
setTimeout(() => {
this.refreshUIEnd(pageModel, false)
}, 500)
return
}
pageModel.loadStrategy = 2
pageModel.pageTotalCompSize = 0;
onRefresh()
}
private refreshUIEnd(pageModel: PageModel, isRefreshSuccess: boolean) {
if (pageModel.loadStrategy != 2) {
return
}
closeRefresh(pageModel, isRefreshSuccess)
}
}
let newPageHelper = new NewPageHelper();
export default newPageHelper as NewPageHelper;
\ No newline at end of file
... ...