- 浏览: 5820231 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
开源项目PullToRefresh详解(一)——PullToRefreshListView
类似Lollipop滚动溢出效果的下拉刷新布局:JellyRefreshLayout
http://www.open-open.com/lib/view/open1437223823115.html
网上很多这样的效果都是继承某个具体的AdapterView或ScrollView,这样很不通用,如果继承自一个ViewGroup(比如LinearLayout),那么任何放在其中的子view都有上拉下拉刷新,那不就完美了?
不废话,上代码:
用法:
具体的看附件
官方下拉刷新控件SwipeRefreshLayout的使用
http://www.cnblogs.com/kross/p/3647498.html
一个顺滑又漂亮的Android下拉刷新与加载更多列表组件
https://github.com/zarics/ZrcListView
Android-PullToRefresh
https://github.com/chrisbanes/Android-PullToRefresh
mPullToRefreshView.onFooterRefreshComplete();
mPullToRefreshView.onHeaderRefreshComplete("更新于:"+new Date().toLocaleString());
是不是这两个地方弄错了呢?
你所说的问题我不清楚,试试这个吧:https://github.com/chrisbanes/Android-PullToRefresh
类似Lollipop滚动溢出效果的下拉刷新布局:JellyRefreshLayout
http://www.open-open.com/lib/view/open1437223823115.html
网上很多这样的效果都是继承某个具体的AdapterView或ScrollView,这样很不通用,如果继承自一个ViewGroup(比如LinearLayout),那么任何放在其中的子view都有上拉下拉刷新,那不就完美了?
不废话,上代码:
import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.ScrollView; import android.widget.TextView; public class PullToRefreshView extends LinearLayout { // private static final String TAG = "PullToRefreshView"; // refresh states private static final int PULL_TO_REFRESH = 2; private static final int RELEASE_TO_REFRESH = 3; private static final int REFRESHING = 4; // pull state private static final int PULL_UP_STATE = 0; private static final int PULL_DOWN_STATE = 1; /** * last y */ private int mLastMotionY; /** * lock */ // private boolean mLock; /** * header view */ private View mHeaderView; /** * footer view */ private View mFooterView; /** * list or grid */ private AdapterView<?> mAdapterView; /** * scrollview */ private ScrollView mScrollView; /** * header view height */ private int mHeaderViewHeight; /** * footer view height */ private int mFooterViewHeight; /** * header view image */ private ImageView mHeaderImageView; /** * footer view image */ private ImageView mFooterImageView; /** * header tip text */ private TextView mHeaderTextView; /** * footer tip text */ private TextView mFooterTextView; /** * header refresh time */ private TextView mHeaderUpdateTextView; /** * footer refresh time */ // private TextView mFooterUpdateTextView; /** * header progress bar */ private ProgressBar mHeaderProgressBar; /** * footer progress bar */ private ProgressBar mFooterProgressBar; /** * layout inflater */ private LayoutInflater mInflater; /** * header view current state */ private int mHeaderState; /** * footer view current state */ private int mFooterState; /** * pull state,pull up or pull down;PULL_UP_STATE or PULL_DOWN_STATE */ private int mPullState; /** * 变为向下的箭头,改变箭头方向 */ private RotateAnimation mFlipAnimation; /** * 变为逆向的箭头,旋转 */ private RotateAnimation mReverseFlipAnimation; /** * footer refresh listener */ private OnFooterRefreshListener mOnFooterRefreshListener; /** * footer refresh listener */ private OnHeaderRefreshListener mOnHeaderRefreshListener; /** * last update time */ // private String mLastUpdateTime; public PullToRefreshView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public PullToRefreshView(Context context) { super(context); init(); } /** * init * * @param context */ private void init() { //需要设置成vertical setOrientation(LinearLayout.VERTICAL); // Load all of the animations we need in code rather than through XML mFlipAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); mFlipAnimation.setInterpolator(new LinearInterpolator()); mFlipAnimation.setDuration(250); mFlipAnimation.setFillAfter(true); mReverseFlipAnimation = new RotateAnimation(-180, 0, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); mReverseFlipAnimation.setInterpolator(new LinearInterpolator()); mReverseFlipAnimation.setDuration(250); mReverseFlipAnimation.setFillAfter(true); mInflater = LayoutInflater.from(getContext()); // header view 在此添加,保证是第一个添加到linearlayout的最上端 addHeaderView(); } private void addHeaderView() { // header view mHeaderView = mInflater.inflate(R.layout.refresh_header, this, false); mHeaderImageView = (ImageView) mHeaderView .findViewById(R.id.pull_to_refresh_image); mHeaderTextView = (TextView) mHeaderView .findViewById(R.id.pull_to_refresh_text); mHeaderUpdateTextView = (TextView) mHeaderView .findViewById(R.id.pull_to_refresh_updated_at); mHeaderProgressBar = (ProgressBar) mHeaderView .findViewById(R.id.pull_to_refresh_progress); // header layout measureView(mHeaderView); mHeaderViewHeight = mHeaderView.getMeasuredHeight(); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mHeaderViewHeight); // 设置topMargin的值为负的header View高度,即将其隐藏在最上方 params.topMargin = -(mHeaderViewHeight); // mHeaderView.setLayoutParams(params1); addView(mHeaderView, params); } private void addFooterView() { // footer view mFooterView = mInflater.inflate(R.layout.refresh_footer, this, false); mFooterImageView = (ImageView) mFooterView .findViewById(R.id.pull_to_load_image); mFooterTextView = (TextView) mFooterView .findViewById(R.id.pull_to_load_text); mFooterProgressBar = (ProgressBar) mFooterView .findViewById(R.id.pull_to_load_progress); // footer layout measureView(mFooterView); mFooterViewHeight = mFooterView.getMeasuredHeight(); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mFooterViewHeight); // int top = getHeight(); // params.topMargin // =getHeight();//在这里getHeight()==0,但在onInterceptTouchEvent()方法里getHeight()已经有值了,不再是0; // getHeight()什么时候会赋值,稍候再研究一下 // 由于是线性布局可以直接添加,只要AdapterView的高度是MATCH_PARENT,那么footer view就会被添加到最后,并隐藏 addView(mFooterView, params); } @Override protected void onFinishInflate() { super.onFinishInflate(); // footer view 在此添加保证添加到linearlayout中的最后 addFooterView(); initContentAdapterView(); } /** * init AdapterView like ListView,GridView and so on;or init ScrollView * */ private void initContentAdapterView() { int count = getChildCount(); if (count < 3) { throw new IllegalArgumentException( "This layout must contain 3 child views,and AdapterView or ScrollView must in the second position!"); } View view = null; for (int i = 0; i < count - 1; ++i) { view = getChildAt(i); if (view instanceof AdapterView<?>) { mAdapterView = (AdapterView<?>) view; } if (view instanceof ScrollView) { // finish later mScrollView = (ScrollView) view; } } if (mAdapterView == null && mScrollView == null) { throw new IllegalArgumentException( "must contain a AdapterView or ScrollView in this layout!"); } } private void measureView(View child) { ViewGroup.LayoutParams p = child.getLayoutParams(); if (p == null) { p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width); int lpHeight = p.height; int childHeightSpec; if (lpHeight > 0) { childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); } else { childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } child.measure(childWidthSpec, childHeightSpec); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { int y = (int) e.getRawY(); switch (e.getAction()) { case MotionEvent.ACTION_DOWN: // 首先拦截down事件,记录y坐标 mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: // deltaY > 0 是向下运动,< 0是向上运动 int deltaY = y - mLastMotionY; if (isRefreshViewScroll(deltaY)) { return true; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: break; } return false; } /* * 如果在onInterceptTouchEvent()方法中没有拦截(即onInterceptTouchEvent()方法中 return * false)则由PullToRefreshView 的子View来处理;否则由下面的方法来处理(即由PullToRefreshView自己来处理) */ @Override public boolean onTouchEvent(MotionEvent event) { // if (mLock) { // return true; // } int y = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // onInterceptTouchEvent已经记录 // mLastMotionY = y; break; case MotionEvent.ACTION_MOVE: int deltaY = y - mLastMotionY; if (mPullState == PULL_DOWN_STATE) {//执行下拉 headerPrepareToRefresh(deltaY); // setHeaderPadding(-mHeaderViewHeight); } else if (mPullState == PULL_UP_STATE) {//执行上拉 footerPrepareToRefresh(deltaY); } mLastMotionY = y; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: int topMargin = getHeaderTopMargin(); if (mPullState == PULL_DOWN_STATE) { if (topMargin >= 0) { // 开始刷新 headerRefreshing(); } else { // 还没有执行刷新,重新隐藏 setHeaderTopMargin(-mHeaderViewHeight); } } else if (mPullState == PULL_UP_STATE) { if (Math.abs(topMargin) >= mHeaderViewHeight + mFooterViewHeight) { // 开始执行footer 刷新 footerRefreshing(); } else { // 还没有执行刷新,重新隐藏 setHeaderTopMargin(-mHeaderViewHeight); } } break; } return super.onTouchEvent(event); } /** * 是否应该到了父View,即PullToRefreshView滑动 * * @param deltaY * , deltaY > 0 是向下运动,< 0是向上运动 * @return */ private boolean isRefreshViewScroll(int deltaY) { if (mHeaderState == REFRESHING || mFooterState == REFRESHING) { return false; } //对于ListView和GridView if (mAdapterView != null) { // 子view(ListView or GridView)滑动到最顶端 if (deltaY > 0) { View child = mAdapterView.getChildAt(0); if (child == null) { // 如果mAdapterView中没有数据,不拦截 return false; } if (mAdapterView.getFirstVisiblePosition() == 0 && child.getTop() == 0) { mPullState = PULL_DOWN_STATE; return true; } int top = child.getTop(); int padding = mAdapterView.getPaddingTop(); if (mAdapterView.getFirstVisiblePosition() == 0 && Math.abs(top - padding) <= 8) {//这里之前用3可以判断,但现在不行,还没找到原因 mPullState = PULL_DOWN_STATE; return true; } } else if (deltaY < 0) { View lastChild = mAdapterView.getChildAt(mAdapterView .getChildCount() - 1); if (lastChild == null) { // 如果mAdapterView中没有数据,不拦截 return false; } // 最后一个子view的Bottom小于父View的高度说明mAdapterView的数据没有填满父view, // 等于父View的高度说明mAdapterView已经滑动到最后 if (lastChild.getBottom() <= getHeight() && mAdapterView.getLastVisiblePosition() == mAdapterView .getCount() - 1) { mPullState = PULL_UP_STATE; return true; } } } // 对于ScrollView if (mScrollView != null) { // 子scroll view滑动到最顶端 View child = mScrollView.getChildAt(0); if (deltaY > 0 && mScrollView.getScrollY() == 0) { mPullState = PULL_DOWN_STATE; return true; } else if (deltaY < 0 && child.getMeasuredHeight() <= getHeight() + mScrollView.getScrollY()) { mPullState = PULL_UP_STATE; return true; } } return false; } /** * header 准备刷新,手指移动过程,还没有释放 * * @param deltaY * ,手指滑动的距离 */ private void headerPrepareToRefresh(int deltaY) { int newTopMargin = changingHeaderViewTopMargin(deltaY); // 当header view的topMargin>=0时,说明已经完全显示出来了,修改header view 的提示状态 if (newTopMargin >= 0 && mHeaderState != RELEASE_TO_REFRESH) { mHeaderTextView.setText(R.string.pull_to_refresh_release_label); mHeaderUpdateTextView.setVisibility(View.VISIBLE); mHeaderImageView.clearAnimation(); mHeaderImageView.startAnimation(mFlipAnimation); mHeaderState = RELEASE_TO_REFRESH; } else if (newTopMargin < 0 && newTopMargin > -mHeaderViewHeight) {// 拖动时没有释放 mHeaderImageView.clearAnimation(); mHeaderImageView.startAnimation(mFlipAnimation); // mHeaderImageView. mHeaderTextView.setText(R.string.pull_to_refresh_pull_label); mHeaderState = PULL_TO_REFRESH; } } /** * footer 准备刷新,手指移动过程,还没有释放 移动footer view高度同样和移动header view * 高度是一样,都是通过修改header view的topmargin的值来达到 * * @param deltaY * ,手指滑动的距离 */ private void footerPrepareToRefresh(int deltaY) { int newTopMargin = changingHeaderViewTopMargin(deltaY); // 如果header view topMargin 的绝对值大于或等于header + footer 的高度 // 说明footer view 完全显示出来了,修改footer view 的提示状态 if (Math.abs(newTopMargin) >= (mHeaderViewHeight + mFooterViewHeight) && mFooterState != RELEASE_TO_REFRESH) { mFooterTextView .setText(R.string.pull_to_refresh_footer_release_label); mFooterImageView.clearAnimation(); mFooterImageView.startAnimation(mFlipAnimation); mFooterState = RELEASE_TO_REFRESH; } else if (Math.abs(newTopMargin) < (mHeaderViewHeight + mFooterViewHeight)) { mFooterImageView.clearAnimation(); mFooterImageView.startAnimation(mFlipAnimation); mFooterTextView.setText(R.string.pull_to_refresh_footer_pull_label); mFooterState = PULL_TO_REFRESH; } } /** * 修改Header view top margin的值 * * @param deltaY */ private int changingHeaderViewTopMargin(int deltaY) { LayoutParams params = (LayoutParams) mHeaderView.getLayoutParams(); float newTopMargin = params.topMargin + deltaY * 0.3f; //这里对上拉做一下限制,因为当前上拉后然后不释放手指直接下拉,会把下拉刷新给触发了,感谢网友yufengzungzhe的指出 //表示如果是在上拉后一段距离,然后直接下拉 if(deltaY>0&&mPullState == PULL_UP_STATE&&Math.abs(params.topMargin) <= mHeaderViewHeight){ return params.topMargin; } //同样地,对下拉做一下限制,避免出现跟上拉操作时一样的bug if(deltaY<0&&mPullState == PULL_DOWN_STATE&&Math.abs(params.topMargin)>=mHeaderViewHeight){ return params.topMargin; } params.topMargin = (int) newTopMargin; mHeaderView.setLayoutParams(params); invalidate(); return params.topMargin; } /** * header refreshing * */ private void headerRefreshing() { mHeaderState = REFRESHING; setHeaderTopMargin(0); mHeaderImageView.setVisibility(View.GONE); mHeaderImageView.clearAnimation(); mHeaderImageView.setImageDrawable(null); mHeaderProgressBar.setVisibility(View.VISIBLE); mHeaderTextView.setText(R.string.pull_to_refresh_refreshing_label); if (mOnHeaderRefreshListener != null) { mOnHeaderRefreshListener.onHeaderRefresh(this); } } /** * footer refreshing * */ private void footerRefreshing() { mFooterState = REFRESHING; int top = mHeaderViewHeight + mFooterViewHeight; setHeaderTopMargin(-top); mFooterImageView.setVisibility(View.GONE); mFooterImageView.clearAnimation(); mFooterImageView.setImageDrawable(null); mFooterProgressBar.setVisibility(View.VISIBLE); mFooterTextView .setText(R.string.pull_to_refresh_footer_refreshing_label); if (mOnFooterRefreshListener != null) { mOnFooterRefreshListener.onFooterRefresh(this); } } /** * 设置header view 的topMargin的值 * * @param topMargin * ,为0时,说明header view 刚好完全显示出来; 为-mHeaderViewHeight时,说明完全隐藏了 */ private void setHeaderTopMargin(int topMargin) { LayoutParams params = (LayoutParams) mHeaderView.getLayoutParams(); params.topMargin = topMargin; mHeaderView.setLayoutParams(params); invalidate(); } /** * header view 完成更新后恢复初始状态 * */ public void onHeaderRefreshComplete() { setHeaderTopMargin(-mHeaderViewHeight); mHeaderImageView.setVisibility(View.VISIBLE); mHeaderImageView.setImageResource(R.drawable.ic_pulltorefresh_arrow); mHeaderTextView.setText(R.string.pull_to_refresh_pull_label); mHeaderProgressBar.setVisibility(View.GONE); // mHeaderUpdateTextView.setText(""); mHeaderState = PULL_TO_REFRESH; } /** * Resets the list to a normal state after a refresh. * * @param lastUpdated * Last updated at. */ public void onHeaderRefreshComplete(CharSequence lastUpdated) { setLastUpdated(lastUpdated); onHeaderRefreshComplete(); } /** * footer view 完成更新后恢复初始状态 */ public void onFooterRefreshComplete() { setHeaderTopMargin(-mHeaderViewHeight); mFooterImageView.setVisibility(View.VISIBLE); mFooterImageView.setImageResource(R.drawable.ic_pulltorefresh_arrow_up); mFooterTextView.setText(R.string.pull_to_refresh_footer_pull_label); mFooterProgressBar.setVisibility(View.GONE); // mHeaderUpdateTextView.setText(""); mFooterState = PULL_TO_REFRESH; } /** * Set a text to represent when the list was last updated. * * @param lastUpdated * Last updated at. */ public void setLastUpdated(CharSequence lastUpdated) { if (lastUpdated != null) { mHeaderUpdateTextView.setVisibility(View.VISIBLE); mHeaderUpdateTextView.setText(lastUpdated); } else { mHeaderUpdateTextView.setVisibility(View.GONE); } } /** * 获取当前header view 的topMargin * */ private int getHeaderTopMargin() { LayoutParams params = (LayoutParams) mHeaderView.getLayoutParams(); return params.topMargin; } // /** // * lock // * // */ // private void lock() { // mLock = true; // } // // /** // * unlock // * // */ // private void unlock() { // mLock = false; // } /** * set headerRefreshListener * * @param headerRefreshListener */ public void setOnHeaderRefreshListener( OnHeaderRefreshListener headerRefreshListener) { mOnHeaderRefreshListener = headerRefreshListener; } public void setOnFooterRefreshListener( OnFooterRefreshListener footerRefreshListener) { mOnFooterRefreshListener = footerRefreshListener; } /** * Interface definition for a callback to be invoked when list/grid footer * view should be refreshed. */ public interface OnFooterRefreshListener { public void onFooterRefresh(PullToRefreshView view); } /** * Interface definition for a callback to be invoked when list/grid header * view should be refreshed. */ public interface OnHeaderRefreshListener { public void onHeaderRefresh(PullToRefreshView view); } }
用法:
import java.util.Date; import android.app.Activity; import android.os.Bundle; import android.widget.GridView; import com.example.pulltorefresh.PullToRefreshView.OnFooterRefreshListener; import com.example.pulltorefresh.PullToRefreshView.OnHeaderRefreshListener; public class TestGridView extends Activity implements OnHeaderRefreshListener,OnFooterRefreshListener{ PullToRefreshView mPullToRefreshView; GridView mGridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_gridview); mPullToRefreshView = (PullToRefreshView)findViewById(R.id.main_pull_refresh_view); mGridView = (GridView)findViewById(R.id.gridview); mGridView.setAdapter(new DataAdapter(this)); mPullToRefreshView.setOnHeaderRefreshListener(this); mPullToRefreshView.setOnFooterRefreshListener(this); mPullToRefreshView.setLastUpdated(new Date().toLocaleString()); } @Override public void onFooterRefresh(PullToRefreshView view) { mPullToRefreshView.postDelayed(new Runnable() { @Override public void run() { mPullToRefreshView.onFooterRefreshComplete(); } },1000); } @Override public void onHeaderRefresh(PullToRefreshView view) { mPullToRefreshView.postDelayed(new Runnable() { @Override public void run() { mPullToRefreshView.onHeaderRefreshComplete("更新于:"+new Date().toLocaleString()); // mPullToRefreshView.onHeaderRefreshComplete(); } },1000); } }
具体的看附件
官方下拉刷新控件SwipeRefreshLayout的使用
http://www.cnblogs.com/kross/p/3647498.html
一个顺滑又漂亮的Android下拉刷新与加载更多列表组件
https://github.com/zarics/ZrcListView
Android-PullToRefresh
https://github.com/chrisbanes/Android-PullToRefresh
- PullToRefresh.zip (743.8 KB)
- 下载次数: 1343
- master_3_.zip (1.6 MB)
- 描述: ZrcListView
- 下载次数: 153
评论
17 楼
dufangyu1990
2016-07-12
楼主,里面是grdiview时,gridview的onItemClick事件有时候不会执行,会进入到PullToRefreshView的OnTouchEvent事件中,请问这个该怎么解决啊
16 楼
senlsy
2015-03-26
喜欢这个方式,顶楼主
15 楼
ETmanwenhan
2014-09-15
Mr葉 写道
: 使用项目中, gridview 拉一次,第二次就拉不动了??
mPullToRefreshView.onFooterRefreshComplete();
mPullToRefreshView.onHeaderRefreshComplete("更新于:"+new Date().toLocaleString());
是不是这两个地方弄错了呢?
14 楼
Mr葉
2014-06-25
: 使用项目中, gridview 拉一次,第二次就拉不动了??
13 楼
zgnckzn
2014-05-15
可以指定是否使用上拉和下拉吗?不想两个都要
12 楼
早起的小虫
2014-05-08
楼主,你的gridview没有下拉刷新啊,其他的都不错
11 楼
gundumw100
2014-01-13
ya0ng 写道
哥,你在易网做过吗?我现在接了一个任务,里面的pullToRefresh模块就是参考的你的,如果没有那就是某个前辈套用的你的实现方法,可是我这个app里面的GridItem在pull down的时候,图片会闪烁,开始pull的时候item图片先消失,等触点稳定后图片才load完整,如果慢慢pull down,图片会一直空白,但其间item的文字始终正常显示,这是由什么造成的呢???
你所说的问题我不清楚,试试这个吧:https://github.com/chrisbanes/Android-PullToRefresh
10 楼
ya0ng
2014-01-13
哥,你在易网做过吗?我现在接了一个任务,里面的pullToRefresh模块就是参考的你的,如果没有那就是某个前辈套用的你的实现方法,可是我这个app里面的GridItem在pull down的时候,图片会闪烁,开始pull的时候item图片先消失,等触点稳定后图片才load完整,如果慢慢pull down,图片会一直空白,但其间item的文字始终正常显示,这是由什么造成的呢???
9 楼
王兮之
2013-09-12
listview的点击事件会被屏蔽掉
8 楼
IT雏鹰1
2013-05-27
楼主是大好人啊,谢谢谢谢!这是对初学者的最大恩赐
7 楼
yangjiantong
2013-05-13
好东西,顶
6 楼
284772894
2013-03-07
试试,看看,如果有用的话,就帮了我大忙了,谢谢
5 楼
hai880830
2013-02-28
4 楼
qiaodanzhou
2013-02-28
楼主这个贡献很大,你立功了
3 楼
ismyhotG
2013-02-22
为什么 程序会在 if (mAdapterView == null && mScrollView == null) {
throw new IllegalArgumentException(
"must contain a AdapterView or ScrollView in this layout!");
}
为什么我的mAdapterView or mScrollView 为null,用的和你一样啊
throw new IllegalArgumentException(
"must contain a AdapterView or ScrollView in this layout!");
}
为什么我的mAdapterView or mScrollView 为null,用的和你一样啊
2 楼
cao123456
2013-02-04
好东西啊 找了好久 终于找到一个,可以用在瀑布流里,LZ好人啊
1 楼
yanjunhui2011
2013-01-15
赞。。。。。。。。。。。。。。。
发表评论
-
NestedScrollView滚动到顶部固定子View悬停挂靠粘在顶端
2018-10-31 20:45 6993网上有一个StickyScrollView,称之为粘性Scro ... -
自定义Behavior实现AppBarLayout越界弹性效果
2017-03-31 09:33 10369一、继承AppBarLayout.Beha ... -
Android - 一种相似图片搜索算法的实现
2017-03-31 09:33 2622算法 缩小尺寸。 将图片缩小到8x8的尺寸,总共64个 ... -
使用SpringAnimation实现带下拉弹簧动画的 ScrollView
2017-03-30 11:30 2848在刚推出的 Support Library 25.3.0 里面 ... -
Android为应用添加角标(Badge)
2017-03-30 11:21 61771.需求简介 角标是什么意思呢? 看下图即可明了: 可 ... -
Android端与笔记本利用局域网进行FTP通信
2017-03-23 10:17 978先看图 打开前: 打开后: Activity类 ... -
PorterDuffColorFilter 在项目中的基本使用
2017-03-03 10:58 1354有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求 ... -
ColorAnimationView 实现了滑动Viewpager 时背景色动态变化的过渡效果
2017-02-24 09:41 2220用法在注释中: import android.anima ... -
迷你轻量级全方向完美滑动处理侧滑控件SlideLayout
2017-01-16 16:53 2594纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 sup ... -
Effect
2017-01-05 09:57 0https://github.com/JetradarMobi ... -
动态主题库Colorful,容易地改变App的配色方案
2016-12-27 14:49 2565Colorful是一个动态主题库,允许您很容易地改变App的配 ... -
对视图的对角线切割DiagonalView
2016-12-27 14:23 1118提供对视图的对角线切割,具有很好的用户定制 基本用法 ... -
仿淘宝京东拖拽商品详情页上下滚动黏滞效果
2016-12-26 16:53 3494比较常用的效果,有现成的,如此甚好!:) import ... -
让任意view具有滑动效果的SlideUp
2016-12-26 09:26 1707基本的类,只有一个: import android.a ... -
AdvancedWebView
2016-12-21 09:44 16https://github.com/delight-im/A ... -
可设置圆角背景边框的按钮, 通过调节色彩明度自动计算按下(pressed)状态颜色
2016-11-02 22:13 1920可设置圆角背景边框的的按钮, 通过调节色彩明度自动计算按下(p ... -
网络请求库相关
2016-10-09 09:35 62https://github.com/amitshekhari ... -
ASimpleCache一个简单的缓存框架
2015-10-26 22:53 2178ASimpleCache 是一个为android制定的 轻量级 ... -
使用ViewDragHelper实现的DragLayout开门效果
2015-10-23 10:55 3415先看一下图,有个直观的了解,向下拖动handle就“开门了”: ... -
保证图片长宽比的同时拉伸图片ImageView
2015-10-16 15:40 3733按比例放大图片,不拉伸失真 import android. ...
相关推荐
SwipeRefreshLayout作为父布局包裹ListView、GridView或ScrollView,提供下拉刷新的功能。当用户在顶部向下拖动时,SwipeRefreshLayout会显示一个刷新指示器,并触发刷新回调。开发者需要在这个回调中执行更新数据的...
5. "scrollview ListView GridView上拉刷新下拉加载":此项目可能包含在一个ScrollView容器内嵌套ListView和GridView的上拉刷新和下拉加载实现,这对于处理复杂布局的场景很有用。 6. "MyGridCustomDemo":这可能是...
总结来说,Android中的ScrollView、ListView和GridView上拉下拉刷新功能的实现涉及到自定义视图、滑动事件监听、数据加载逻辑和缓冲效果优化。熟练掌握这些技术,能有效提升应用的用户体验,使用户在浏览大量数据时...
一个android上拉下拉刷新的基类,支持ListView,GridView和ScrollView的上拉下拉刷新,刷新效果不错。 是我从别的地方看到的,我把它搬了过来。 来自http://gundumw100.iteye.com/blog/1764763
通过以上介绍,我们可以看到,尽管ListView、GridView和ScrollView在实现下拉刷新和上拉加载更多时有一些共通之处,但具体实现细节会因组件特性和需求不同而有所差异。理解这些组件的工作原理并掌握相应的库和技巧,...
上拉刷新,下拉加载的靠谱的第三方。支持listview,scrollview,gridview等等 相关博客地址 http://blog.csdn.net/waterthegreat/article/details/51908095
在实际应用中,ListView和GridView通常配合Adapter使用,因此在实现下拉刷新和上拉加载更多时,可能需要更新Adapter的数据集,并通知Adapter数据已改变。同时,为了保持良好的用户体验,需要在加载数据过程中禁用...
总之,这个资源为开发者提供了一手的学习材料,通过研究源码和运行Demo,不仅可以加深对ListView、GridView、ScrollView的理解,还能掌握上拉下拉功能的实现技巧,提高Android应用开发的能力。对于希望优化滚动性能...
至于文件"ScrollView_GridView_listViewRefresh_Demo",很可能是一个包含示例代码的项目,展示了如何在ScrollView、ListView和GridView中实现下拉刷新和上拉加载更多的功能。这个项目的源码可以作为学习和参考的资源...
在Android应用开发中,"下拉刷新"和"上拉加载更多"是常见的用户体验功能,尤其是在数据列表展示中,如GridView、ListView和ScrollView等。这些功能使得用户在滚动到列表顶部时可以更新内容(下拉刷新),而在滚动到...
最后,关于`ScrollView_GridView_listViewRefresh_Demo`这个示例项目,它很可能是包含了一个实际运行的代码实例,演示了如何在ScrollView中嵌套ListView和GridView,并实现了上下拉刷新和加载更多功能。通过查看和...
本文将深入探讨在Android中如何实现ListView、GridView、WebView、ExpandableListView和ScrollView的下拉刷新功能,以及相关的源码分析。 1. **ListView的下拉刷新** ListView是Android中最常用的视图控件之一,...
总的来说,下拉刷新是现代移动应用中不可或缺的功能,对于ListView、GridView、ScrollView和WebView,我们可以通过原生API、自定义实现或使用第三方库来实现这一功能,提升应用的用户体验。在具体实施过程中,需要...
综上所述,下拉刷新功能在Android应用中扮演着重要角色,无论是ListView、GridView、ScrollView还是WebView,都有相应的方法来实现这一功能。开发者可以根据项目需求和组件特性选择合适的方式进行集成。
Android PullToRefresh 下拉刷新,上拉更多,支持ScrollView,ListView,可方便拓展GridView,WebView等,我主要测试了ScrollView,ListView代码中已实现不过没怎么测,其他的还是很好拓展的的,在isReadyForPullUp...
在Android开发中,有时我们需要在一个滚动视图(ScrollView)中嵌套列表视图(ListView)或者网格视图(GridView),并实现上拉加载更多和下拉刷新的功能。这样的设计可以让我们展示大量的数据,并且允许用户方便地...
本项目主要探讨的是如何在ListView和GridView上实现“上拉加载更多”和“下拉刷新”的功能,这对于拥有大数据量的应用来说是至关重要的。下面我们将详细讲解这两个功能的实现原理和步骤。 首先,"下拉刷新"(Pull-...
Android-PullToRefresh支持ListView、GridView、ScrollView、WebView等.可以直接导入eclipse使用。在自己的项目中的使用的时候add as library就行了
而“上拉刷新,下拉加载”功能则是现代移动应用中不可或缺的一部分,它提升了用户体验,允许用户在滚动到底部时加载更多内容,或者在顶部拉动时刷新数据。本项目基于Android Studio实现,旨在为这些视图提供这种动态...