-
安卓下拉刷新
2014-04-14 16:40:52 -
mysql安卓下拉刷新重复数据_安卓下拉刷新、上拉加载数据显示
2021-01-20 00:14:52整个是一个scrollView,嵌套一个线性布局,下拉刷新、或者上拉加载后,通过addView()方法,加载消息体,每一个消息体是一个复杂的子view。做一个类似qq客户端“好友动态“刷新的东西,在网上找了很多,大体有3种布局...整个是一个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,定义每个消息体的布局
框架结构如图:
动态添加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了。
-
安卓下拉刷新控件
2018-10-06 11:31:27目前已经实现了四种下拉刷新效果: 新浪微博下拉刷新风格(可设置各种状态是的文本,可设置整个刷新头部的背景) 慕课网下拉刷新风格(可设置其中的 logo 和颜色成自己公司的风格,可设置整个刷新头部的背景) 美团... -
mysql安卓下拉刷新重复数据_安卓实现下拉刷新效果
2021-02-08 07:08:12下面记录一种通过调用第三方文件实现下拉刷新ListView的方法步骤一、先在github中搜索Android-PullToRefresh-master并下载步骤二、在AndroidStudio中新建一个项目,右键Importt Module导入Android-PullToRefresh-...先上效果图:
使用网络应用时,比如QQ、微信这些,我们经常会通过下拉实现消息的刷新。下面记录一种通过调用第三方文件实现下拉刷新ListView的方法
步骤一、先在github中搜索Android-PullToRefresh-master并下载
步骤二、在AndroidStudio中新建一个项目,右键Importt Module导入Android-PullToRefresh-master中的library文件(注意调整好项目的sdk和jdk版本)如何导入类库文件?
步骤三、复制类库文件library中的PullToRefreshListView.java的路径到自己新建的项目中的布局文件中,并给它添加宽高和id,如下
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.contentprovide.liuliu.demo_3_3_7.MainActivity">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_listview"
>
步骤四、在java文件中使用集合和适配器给集合添加列表项内容,在异步线程中处理刷新行为,并且在ListView对象中的监听事件中执行异步线程
package com.contentprovide.liuliu.demo_3_3_7;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
PullToRefreshListView my_listview;
//定义一个集合对象用于存放listview的列表项内容
List list;
// 定义一个ListView适配器
ArrayAdapter arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my_listview = (PullToRefreshListView) findViewById(R.id.my_listview);
list = new ArrayList<>();
list.add("Item1");
list.add("Item2");
list.add("Item3");
list.add("Item4");
arrayAdapter = new ArrayAdapter(this,R.layout.support_simple_spinner_dropdown_item,list);
// 把适配器添加ListView对象中
my_listview.setAdapter(arrayAdapter);
// 设置事件监听器
my_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener() {
@Override
public void onRefresh(PullToRefreshBase refreshView) {
// 执行异步线程
asyncTask.execute();
}
});
}
// 在异步线程中处理刷新行为
AsyncTask asyncTask = new AsyncTask() {
@Override
protected Void doInBackground(Void... voids) {
// 手动休眠三秒,模仿从服务器端获取信息的延迟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
list.add("新增加的Item1");
list.add("新增加的Item2");
// 通知ListView对象刷新完成
my_listview.onRefreshComplete();
}
};
}
今天看到之前写的这篇博客突然发现了一个问题,我上面写的这个刷新程序当我连续下拉刷新了两次之后程序就会崩溃强制弹出,后来重新看了一遍代码发现是线程执行那里的问题。AsyncTask的对象是只能执行一次的 ,如果我需要执行同一个线程对象多次可以使用匿名对象,每一次都用一个新的对象去执行。下面是我更新后的步骤四的代码,其他步骤没有问题:
package com.contentprovide.liuliu.demo_3_3_7;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.ArrayList;
import java.util.List;public classMainActivity extends AppCompatActivity {
PullToRefreshListView my_listview;//定义一个集合对象用于存放listview的列表项内容
Listlist;//定义一个ListView适配器
ArrayAdapterarrayAdapter;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my_listview=(PullToRefreshListView) findViewById(R.id.my_listview);
list= new ArrayList<>();
list.add("Item1");
list.add("Item2");
list.add("Item3");
list.add("Item4");
arrayAdapter= new ArrayAdapter(this,R.layout.support_simple_spinner_dropdown_item,list);//把适配器添加ListView对象中
my_listview.setAdapter(arrayAdapter);//设置事件监听器
my_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener() {
@Overridepublic void onRefresh(PullToRefreshBaserefreshView) {//执行异步线程
new AsyncTask() {
@Override
protectedVoid doInBackground(Void... voids) {
// 手动休眠三秒,模仿从服务器端获取信息的延迟
try{
Thread.sleep(3000);
} catch(InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected voidonPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
list.add("新增加的Item1");
list.add("新增加的Item2");
// 通知ListView对象刷新完成
my_listview.onRefreshComplete();
}
};
.execute(); } });
}
-
安卓 下拉刷新上拉加载 整合了item侧滑功能listview
2016-05-09 13:25:38安卓 下拉刷新上拉加载 整合了item侧滑功能 解决滑动冲突 -
mysql安卓下拉刷新重复数据_安卓下拉刷新上拉加载 多长时间拉取一次数据
2021-02-08 07:08:01几个常用方法: setPullRefreshEnable(boolean enable):是否允许下拉刷新 setPullLoadEnable(boolean enable):是否允许上拉加载更多 stopRefresh():停止刷新,重置header view stopLoadMore():停止加载更多,...展开全部
1、XListView因为32313133353236313431303231363533e58685e5aeb931333361306339添加了Header,会导致存储的数据+1,所以赋值时需要position-1。补充:当去掉HeaderView时,position不用-1。
2、提个建议:上拉加载更多,最好在onCreate()中就执行setAdapter,然后不论是空数据、还是有数据,只用更新适配器就行了。
一、XListView
1、下载
gitHub的地址。或者从这儿下。
2、用法
导入图中的me.maxwin.view包
提供了两个接口:
IXListViewListener:触发下拉刷新,上拉加载更多。实现此接口时,onLoadMore()用来上拉加载更多,onRefresh()用来下拉刷新。
OnXScrollListener:和原生的OnScrollListener一样,但是在header/footer回滚时也会触发。
几个常用方法:
setPullRefreshEnable(boolean enable):是否允许下拉刷新
setPullLoadEnable(boolean enable):是否允许上拉加载更多
stopRefresh():停止刷新,重置header view
stopLoadMore():停止加载更多,重置footer view
请求到数据后停止刷新停止加载更多。
setRefreshTime(String time):设置上次刷新的时间
onLoadMore():加载更多时调用的方法。注意第一次进入时不会调用此方法。
onRefresh():下拉刷新时调用的方法。
3、代码中怎么体现
1)实现IXListViewListener接口->2)实现上拉刷新和下拉加载更多的数据变更->3)更新header view和footer view,并设置更新时间。
[java] view plaincopy
//1、实现IXListViewListener接口
mListView.setXListViewListener(this);
//2.1 onRefresh中实现下拉刷新的数据加载
@Override
public void onRefresh() {
//请求数据
//更新界面显示
[java] view plaincopy
onLoad();
}//2.2 onLoadMore中实现上拉加载更多的数据加载
[java] view plaincopy
@Override
public void onLoadMore() {
//请求数据
//更新界面显示
[java] view plaincopy
onLoad();
}//3、加载完数据后,复位header view和footer view,并设置更新的时间。
[java] view plaincopy
private void onLoad() {
mListView.stopRefresh();mListView.stopLoadMore();
mListView.setRefreshTime("刚刚");
}
4、xml注意事项
当将XListView嵌入到LinearLayout中时,XListView占满全屏时不能再加载更多。上错误代码:
[java] view plaincopy
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/takemain_ll"
android:layout_below="@id/takemain_l"
android:orientation="vertical" >
android:id="@+id/home_list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
5、去ScrollView共用
这种情况,重写XListView会导致上拉加载时频繁的报错:适配器未更新,不知道咋解决。
二、PullToRefresh
大部分内容转自鸿洋的博客:http://blog.csdn.net/lmj623565791/article/details/38238749
1、整体了解:
首先,github上的这个控件:pull-to-refresh,例子中的功能非常强大,可不止支持ListView和GridView。在下载前,先说下项目结构。github上下载的例子,是依赖于三个项目的,一个基本的library_pullToRefresh(自己要引用到的项目。怎么引用?自己的项目右键->Properties->Android,在Is Library中选择路径),一个基本的PullToRefreshViewPager,一个PullToRefreshListFragment。
2、用法
1)设置PullToRefreshListView支持上拉加载和下拉刷新->2)初始化控件,设置适配器->3)设置监听事件。在监听事件中处理上拉加载更多和下拉刷新,设置最后更新的时间。
[java] view plaincopy
//1、支持上拉加载和下拉刷新
mPullRefreshListView.setMode(Mode.BOTH);
//2、设置适配器 mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mListItems); mPullRefreshListView.setAdapter(mAdapter); //3、设置监听器mPullRefreshListView.setOnRefreshListener(new OnRefreshListener2(){ @Override public void onPullDownToRefresh( PullToRefreshBase refreshView){ // 显示最后更新的时间 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); //这里写下拉刷新的任务 new GetDataTask().execute(); } @Override public void onPullUpToRefresh(PullToRefreshBase refreshView){ // 显示最后更新的时间 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
[java] view plaincopy
//这里写上拉加载更多的任务
new GetDataTask().execute(); } });
3、属性介绍
1)ptr:ptrMode="both"支持上拉加载和下拉刷新。disabled禁用下拉刷新和上拉加载。pullFromEnd仅支持上拉加载。manualOnly只允许手动触发。当然通过代码也可设置:lv.setMode(Mode.BOTH);
2)ptr:trAnimationStyle="flip" flip:翻转动画;rotate:旋转动画。
3)ptr:ptrDrawable="@drawable/ic_launcher"设置图标
4)ptrScrollingWhileRefreshingEnabled刷新的时候,是否允许ListView或GridView滚动。觉得为true比较好。5)ptrListViewExtrasEnabled 决定了Header,Footer以何种方式加入mPullRefreshListView,true为headView方式加入,就是滚动时刷新头部会一起滚动。
4、自定义下拉指示器文本内容等效果:
在初始化完成PullToRefreshListView后,通过lv.getLoadingLayoutProxy()可得到一个ILoadingLayout对象,这个对象可设置各种指示器中的样式、文本等。
[java] view plaincopy
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy();
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
默认是上拉和下拉的字同时改变的,如果希望单独改变呢:
本回答由提问者推荐
已赞过
已踩过<
你对这个回答的评价是?
评论
收起
-
安卓下拉刷新开源库对比
2016-08-08 16:27:35安卓下拉刷新开源库对比 目前仅比对github上star数>1500的下拉刷新开源库,在比较完成之后可能会加入其它有代表性的库. Repo Repo Owner Star(2015.12.5) version Snap shot ... -
安卓下拉刷新SwipeRefreshLayout
2019-09-29 15:12:17SwipeRefreshLayout就是用于实现下拉刷新功能的核心类,我们把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout中,就可以迅速让这个控件支持下拉刷新。 代码比较简单,直接上代码: activity_main.xml 这里想让... -
mysql安卓下拉刷新重复数据_Android 今日头条下拉刷新实现
2021-01-20 00:14:52前言前两天在玩今日头条,觉得今日头条的下拉刷新蛮有意思的,就自己实现了一下,整体上实现了同样的效果。无图无真相,效果图如下:今日头条效果:image实现效果:image实现过程分为两部分:图形绘制结合下拉刷新动... -
安卓下拉刷新scroll view
2016-01-31 11:40:09做一款安卓小应用 需要利用scrollview控件下拉刷新列表显示加载数据的代码。 -
mysql安卓下拉刷新重复数据_安卓Tips之RecycleView下拉刷新数据的一个bug
2021-02-08 07:08:13Invalid item position之前在做萌妹纸App的时候,一位同学给我提了一个issuse,原因是使用RecycleView下拉拉取新数据的时候,同时在向上滑动RecycleView时程序就崩溃了。GifGIF_20160719_085409.gif报错... -
安卓下拉刷新解决方案
2016-01-13 20:44:48下拉刷新,几乎是每个 Android 应用都会需要的功能。 android-Ultra-Pull-To-Refresh (以下简称 UltraPTR )便是一个强大的 Andriod 下拉刷新框架。 主要功能及优点 1.继承于 ViewGroup, Content 可以包含... -
安卓下拉刷新(ScrollView)
2016-03-18 02:05:39ScrollView内嵌LinearLayout(head)和webview、listview,现在的问题是,当webview的内容超出屏幕,在下拉刷新的时候,LinearLayout(head)会被覆盖(没有消失),跳到webview顶部,大神们,能给讲解下是肿么回事... -
安卓下拉刷新的一种实现
2019-12-25 00:19:35本文主要是基于ViewGroup来实现平滑下拉和弹性回归的PTR控件。 -
实现安卓下拉刷新自动返回
2016-12-13 23:38:09由于作者刚接触安卓没多久,听到前辈的方法说发帖可提高水平特此发帖,如有错误欢迎大家对我提出,我会及时更正的。 第一步:1.先创建一个总体类 2.创建一个适配器adapter包,里面创建class(可命名为**... -
安卓下拉刷新并取消的实现(超简单)
2019-10-18 14:35:18即下拉刷新的效果(刷新完成后修改页面数据)。在网上搜索了一番总算是找到了解决办法。话不多说,下面简单介绍一下SwiperRefreshLayout控件的使用。 1.在xml文件中添加SwiperRefreshLayout控件 <androidx.... -
安卓下拉刷新,pulltorefresh的使用
2015-08-21 15:02:08一个下拉刷新的工具,可在github中找到,下面介绍一下用法 1.首先导入,这个就不说了,里面有很多工具,listView,webview等, 2.以listview为例,首先是布局文件 xmlns:ptr="http://schemas.android.c -
安卓下拉刷新和上拉加载的具体实例
2018-01-13 11:13:00//下拉刷新,上拉加载更多api 'com.cjj.materialrefeshlayout:library:1.3.0' 2.先上项目图 3.DividerItemDecoration public class DividerItemDecoration extends RecyclerView.ItemDecoration { pr... -
安卓下拉刷新、上拉加载数据显示
2014-04-26 22:22:00整个是一个scrollView,嵌套一个线性布局,下拉刷新、或者上拉加载后,通过addView()方法,加载消息体,每一个消息体是一个复杂的子view。 做一个类似qq客户端“好友动态“刷新的东西,在网上找了很多,大体有3种... -
安卓下拉刷新空间SwipeRefreshLayout的基本使用
2018-01-12 16:35:00刷新完成,必须调用,否则会一直是圈圈转转的情况 swipeRefreshLayout.setRefreshing( false ); } }, 2000 ); } }); } private static final String TAG = " MainActivity " ; private void ... -
安卓 下拉刷新 与Recyclerview配合食用(新手笔记-16)
2018-03-13 18:29:21我们可以使用SwipeRefreshLayout来实现下拉刷新功能(也有很多其他控件,酌情使用)。在布局文件中,把我们需要下拉刷新的布局放入SwipeRefreshLayout中进行布局设计(一般只放一个,不过大多数情况一个Recyclerview... -
MUI安卓下拉刷新无反应的问题(但是在mui官方demo是可以的);
2018-02-08 13:20:06最近使用MUI这个框架使用下拉刷新插件的时候,在电脑和苹果手机测试都没有问题,但是一上线却发现安卓打包成APP后无法使用的问题。针对这一问题,博主只想说大家在开发的过程中真的是没有认真官方的文档,官方文档...