我知道,iPhone中的pullToRefresh类似功能可用,而我们必须手动管理Android。ScrollView上的Android PullTo刷新
我的有pullToRefresh得到了一些例子,但它的工作原理上仅ListView中。
在我来说,我要实现的滚动型。类似于Google Play中DrawFree应用程序中的PullToRefresh。
请参见下面的图片:
那么,如何实现呢?
任何示例来实现它将非常感激。
在此先感谢。
我知道,iPhone中的pullToRefresh类似功能可用,而我们必须手动管理Android。ScrollView上的Android PullTo刷新
我的有pullToRefresh得到了一些例子,但它的工作原理上仅ListView中。
在我来说,我要实现的滚动型。类似于Google Play中DrawFree应用程序中的PullToRefresh。
请参见下面的图片:
那么,如何实现呢?
任何示例来实现它将非常感激。
在此先感谢。
这是实现拉ListView中刷新,GridView中,web视图,可扩展的ListView的很好的例子。
你可以用这个例子,并根据大家的意见进行修改。
[编辑:我的解决办法是Gmail的状,我很抱歉,如果这不是你想要什么,反正我张贴代码,别人是有用]
我已经刚做完了,我已经在Joe Dailey编写的example之后的ListView中实现了它(非常好,很简单)。然后我重新考虑它与ScrollView一起使用。
这是我做了什么:
我设置onTouchListener的滚动型; (scrollView.getScrollY()== 0) 然后,我使用“lastY = startY”来知道我是否向下滚动或向上滚动(这两个变量都是活动字段) 。
“act.refresh()”是运行任务,从我的服务器上获取数据的方法。
在你asynkTask的onPostExecute方法,或在处理程序,如果你使用hanlders,你叫“finishRefresh()”方法;
这是onTouchListener:
class RefreshTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
ScrollView scroll = (ScrollView) v;
if (scroll.getScrollY() == 0) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startY = event.getY();
lastY = startY;
break;
case MotionEvent.ACTION_MOVE:
if (!refreshing && event.getY() > lastY) {
lastY = event.getY();
if (event.getY() - startY <= dragLength) {
double percent = 1 - (event.getY() - startY)/dragLength;
double weight;
weight = 2 * Math.pow(percent, 0.8);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) progress.getLayoutParams();
params.weight = (float) weight;
progress.setLayoutParams(params);
progress.setIndeterminate(false);
progress.setPadding(0, 0, 0, 0);
return true;
} else {
refreshing = true;
act.refresh();
startY = 100000f;
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) progress.getLayoutParams();
params.weight = 0;
progress.setIndeterminate(true);
progress.postInvalidate();
progress.setLayoutParams(params);
}
}
case MotionEvent.ACTION_UP:
startY = 100000f;
Log.i(TAG, "action up " + event.getY());
if (!refreshing) {
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) progress.getLayoutParams();
params.weight = 2;
progress.setLayoutParams(params);
}
}
}
return false;
}
}
这是finishRefresh()方法:
public void finishRefresh() {
progress.setIndeterminate(false);
progress.postInvalidate();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) progress.getLayoutParams();
params.weight = 2;
progress.setLayoutParams(params);
refreshing = false;
}
这是代码生成的布局,在进度和其他一切:
private void createProgressBarLayout() {
topMargin = -Math.round(6 * act.metrics.density);
dragLength = Math.round(act.screen_size.y/2.5f);
LinearLayout top = new LinearLayout(this);
top.setGravity(Gravity.TOP);
top.setOrientation(LinearLayout.HORIZONTAL);
content_rel_layout = (RelativeLayout) findViewById(R.id.rel_layout_name);
content_rel_layout.addView(top);
ViewGroup.LayoutParams topParams = top.getLayoutParams();
topParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
topParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
top.setLayoutParams(topParams);
FrameLayout left = new FrameLayout(this);
progress = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
progress.setProgress(100);
progress.setIndeterminate(false);
// progress.setBackgroundResource(R.drawable.progress_bar);
FrameLayout right = new FrameLayout(this);
top.addView(left);
top.addView(progress);
top.addView(right);
LinearLayout.LayoutParams leftParams = (LinearLayout.LayoutParams) left.getLayoutParams();
leftParams.weight = 1;
leftParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
leftParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
leftParams.topMargin = topMargin;
left.setLayoutParams(leftParams);
LinearLayout.LayoutParams progressParams = (LinearLayout.LayoutParams) progress.getLayoutParams();
progressParams.weight = 2;
progressParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
progressParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
progressParams.topMargin = topMargin;
progress.setLayoutParams(progressParams);
LinearLayout.LayoutParams rightParams = (LinearLayout.LayoutParams) right.getLayoutParams();
rightParams.weight = 1;
rightParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
rightParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
rightParams.topMargin = topMargin;
right.setLayoutParams(rightParams);
ScrollView sv = (ScrollView) findViewById(R.id.prof_mon4_vert_scroll);
sv.setOnTouchListener(new RefreshTouchListener());
}
请随时问我每一个疑问! 享受
嗨洛伦佐,请你提一下什么是act.metrics.density和act.screen_size.y的所有值。谢谢。 – Durai 2014-02-14 10:49:31
最新回答,但可能有用: 指标如下: DisplayMetrics metrics = new DisplayMetrics(); [activity_context] .getWindowManager()。getDefaultDisplay()。getMetrics(metrics); – 2014-10-22 19:07:42
感谢您的解决方案。 – 2012-07-09 08:59:28
示例项目已弃用 – JUL2791 2017-03-16 16:31:14