2012-07-07 57 views
2

我知道,iPhone中的pullToRefresh类似功能可用,而我们必须手动管理Android。ScrollView上的Android PullTo刷新

我的有pullToRefresh得到了一些例子,但它的工作原理上仅ListView中。

在我来说,我要实现的滚动型。类似于Google Play中DrawFree应用程序中的PullToRefresh。

请参见下面的图片:

enter image description here

那么,如何实现呢?

任何示例来实现它将非常感激。

在此先感谢。

回答

12

这是实现拉ListView中刷新,GridView中,web视图,可扩展的ListView的很好的例子。

你可以用这个例子,并根据大家的意见进行修改。

https://github.com/chrisbanes/Android-PullToRefresh

+0

感谢您的解决方案。 – 2012-07-09 08:59:28

+0

示例项目已弃用 – JUL2791 2017-03-16 16:31:14

4

[编辑:我的解决办法是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()); 
} 

请随时问我每一个疑问! 享受

+1

嗨洛伦佐,请你提一下什么是act.metrics.density和act.screen_size.y的所有值。谢谢。 – Durai 2014-02-14 10:49:31

+0

最新回答,但可能有用: 指标如下: DisplayMetrics metrics = new DisplayMetrics(); [activity_context] .getWindowManager()。getDefaultDisplay()。getMetrics(metrics); – 2014-10-22 19:07:42