mysql安卓下拉刷新重复数据_安卓下拉刷新、上拉加载数据显示

整个是一个scrollView,嵌套一个线性布局,下拉刷新、或者上拉加载后,通过addView()方法,加载消息体,每一个消息体是一个复杂的子view。

做一个类似qq客户端“好友动态“刷新的东西,在网上找了很多,大体有3种布局类型的下拉刷新,listView、scrollView、gridView。

下拉刷新的原理网上很详细,简单点说,,拿 "好友动态" 举例,有

1、ElasticScrollViewActivity.java(对应的xml文件是main.xml,里面嵌套com.ElasticScrollView.view.ElasticScrollView)、

2、ElasticScrollView.java(继承自scrollView,定义一个ScrollView类,然后再friendCircleActivity里定义一个scrollView,scrollView的addChild方法,或者通过activityactivity_friendCircle布局里面的LinearLayout  friendList的addView方法,添加singleMessage。scrollView绑定onFreshListener。这个类里面定义刷新的各个状态,下拉刷新头的更新等,下拉刷新header各个控件:下拉箭头、相关文字提示、刷新日期提示等,里面通过inflate引入headerView、coverImageView,本身是个View,没有专门对应xml文件)、

3、SingleMessageView.java(下拉刷新后,动态添加的一条条消息体,是消息体的布局,通过inflate引入sing_msg.xml),

4、activity_friendCircle.xml  就是在你的滚动布局scrollFreshview里面,根据需要再添加一个类似  ”好友动态“里自定义封面的view视图

5、single_msg.xml,定义每个消息体的布局

框架结构如图:

23589665

wGHID70FbNxyQAAAABJRU5ErkJggg==

动态添加view,用的是linearLayout的addView方法,这样,需要在scrollFreshview的代码中定义一个LayoutInflate innerLayout,然后在这个layout里面inflate进headerView、coverImageView:

LayoutInflater inflater = LayoutInflater.from(context);

innerLayout = newLinearLayout(context);

innerLayout.setLayoutParams(newLinearLayout.LayoutParams(

LinearLayout.LayoutParams.FILL_PARENT,

LinearLayout.LayoutParams.WRAP_CONTENT));

innerLayout.setOrientation(LinearLayout.VERTICAL);

headView = (LinearLayout) inflater.inflate(R.layout.mylistview_head,

null);

coverScrollView = (ScrollView) inflater.inflate(R.layout.activity_friends_circle,

null);

innerLayout.addView(headView);

innerLayout.addView(coverScrollView);

addView(innerLayout);

来源参考:http://www.apkbus.com/android-51424-1-1.html(怎么加自定义封面,怎么定义动态添加消息的顺序,博主写的很详细,原博主用的是thread线程添加的,我的用的是异步任务)

添加上拉加载功能的时候,需要修改一下touchEvent事件,并且添加一个footView:

@Overridepublic booleanonTouchEvent(MotionEvent ev) {//TODO Auto-generated method stub

switch(ev.getAction()) {caseMotionEvent.ACTION_DOWN:if (this.getScrollY() == 0 && !isRecored) {

startY= (int) ev.getY();

isRecored= true;

}break;caseMotionEvent.ACTION_MOVE:int tempY = (int) ev.getY();if (!isScroll)

isScroll= true;if (!isRecored && this.getScrollY() == 0) {

isRecored= true;

startY=tempY;

}if (tempY - startY < 0) {

startY=tempY;

}if (state != REFRESHING && state != LOADING &&isRecored) {if (state ==RELEASE_To_REFRESH) {if ((tempY - startY) > 0

&& (tempY - startY) / RATIO < headContentHeight + 10) {

state=PULL_To_REFRESH;

changeHeaderViewByState();

}else if (tempY - startY <= 0) {

state=DONE;

changeHeaderViewByState();

}

}if (state ==PULL_To_REFRESH) {if ((tempY - startY) / RATIO >= headContentHeight + 10) {

state=RELEASE_To_REFRESH;

isBack= true;

changeHeaderViewByState();

}else if (tempY - startY <= 0) {

state=DONE;

changeHeaderViewByState();

}

}if (state ==DONE) {if (tempY - startY > 0) {

state=PULL_To_REFRESH;

changeHeaderViewByState();

isSeeHead= true;

}

}if (state ==RELEASE_To_REFRESH) {

headView.setPadding(0, (tempY - startY) /RATIO- headContentHeight, 0, 0);

headView.invalidate();

}else if (state ==PULL_To_REFRESH) {

headView.setPadding(0, -1 *headContentHeight+ (tempY - startY) / RATIO, 0, 0);

headView.invalidate();

}

}break;caseMotionEvent.ACTION_UP:

Message message= newMessage();

message.obj=myScrollView;

handler.sendMessageDelayed(message,5);if (state ==PULL_To_REFRESH) {

state=DONE;

changeHeaderViewByState();

innerlayout_checkVisibility();

}if (state ==RELEASE_To_REFRESH) {

state=REFRESHING;

changeHeaderViewByState();

onRefresh();

}

isRecored= false;

isSeeHead= false;

isBack= false;

viewHeight=innerLayout.getHeight();

y= this.getScrollY();if ((viewHeight - y - this.getHeight()) == 0 &&isScroll&& state != REFRESHING && state !=LOADING) {

onLoad();

}

isScroll= false;break;

}if(isSeeHead) {return true;

}else{return super.onTouchEvent(ev);

}

}

像定义刷新接口一样,这时也需要定义一个上拉加载的load接口,整个scrollView绑定上拉加载监听器,定义Onload()方法,

public voidsetOnLoadListener(OnLoadListener loadListener) {this.loadListener =loadListener;

}public interfaceOnLoadListener {public voidonLoad();

}private voidonLoad() {if (loadListener != null) {

state=LOADING;

footView.setVisibility(View.VISIBLE);

moreProgressBar.setVisibility(View.VISIBLE);

loadMoreView.setText("正在加载更多...");

loadListener.onLoad();//onRefresh();

}

}public voidonLoadComplete() {

state=DONE;

moreProgressBar.setVisibility(View.GONE);

loadMoreView.setText("上拉加载更多");//footView.setVisibility(View.INVISIBLE);

}

然后在朋友圈界面,绑定load监听器,定义上拉加载的异步任务就可以了。下拉刷新、上拉加载的区别,就是上拉加载需要实时判定用户的动作,更改刷新header的状态,而下拉加载就是一个固定在整个view的尾部的布局,当用户手指离开屏幕,并且滑动偏移量滑到底端的时候执行onload()方法就ok了。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值