【问题标题】:SwipeRefreshLayout with vertical view pager to only refresh on the topmost fragmentSwipeRefreshLayout 与垂直视图寻呼机只刷新最顶部的片段
【发布时间】:2015-09-09 08:15:16
【问题描述】:

我尝试在我的代码中实现swiperefreshlayout,但是当我在第一个Fragment 即第0 个Fragment 时,它会不断刷新整个寻呼机而不是仅仅刷新。 如图所示,我尝试将刷新设置为 false,但加载程序仍然出现,并且当我再次返回第 0 个Fragment 时不会重置。 在设置swiperefreshlayout.enable(false) 时,我无法在任何地方刷新它。 任何人都可以提出替代方案吗? 这是我的XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentLinearLayout"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:fillViewport="true">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
            <lbbdapp.littleblackbook.com.littleblackbook.Support.VerticalViewPager
                android:id="@+id/verticalViewPager"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
            </LinearLayout>
        </ScrollView>
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

这是我的活动:

public class FeedActivity extends ActionBarActivity {

PageAdapter mPageAdapter;
ProgressBar mProgressBar;
ProgressDialog prog;
ViewPager pager;
String article_id;
private float x1, x2;
SwipeRefreshLayout mSwipeRefreshLayout;

ArrayList<FragmentObject> mObjectsDataList;
ArrayList<ArticleObject> mArticleDataList=new ArrayList<ArticleObject>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.feed_layout);
    mObjectsDataList = new ArrayList<FragmentObject>();

    DataFetcherTask myTask = new DataFetcherTask();
    myTask.execute();

    mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
    mSwipeRefreshLayout.setColorScheme(android.R.color.holo_blue_bright,
            android.R.color.holo_blue_dark,
            android.R.color.holo_purple,
            android.R.color.darker_gray);
    pager=(ViewPager)findViewById(R.id.verticalViewPager);



    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {

            if(pager.getCurrentItem()==0) {
                Log.wtf("current item is 0", "0");
                mSwipeRefreshLayout.setRefreshing(true);
                Log.wtf("Swiping", "Refreshing");
                (new Handler()).postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSwipeRefreshLayout.setRefreshing(false);
                        DataFetcherTask myTask = new DataFetcherTask();
                        myTask.execute();
                    }
                }, 3000);

            }
            else{
                mSwipeRefreshLayout.setRefreshing(false);

            }
        }

    });


}

这是我的垂直ViewPager

public class VerticalViewPager extends ViewPager {

public VerticalViewPager(Context context) {
    super(context);
    init();
}

public VerticalViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    // The majority of the magic happens here
    setPageTransformer(true, new VerticalPageTransformer());
    // The easiest way to get rid of the overscroll drawing that happens on the left and right
    setOverScrollMode(OVER_SCROLL_NEVER);
}

private class VerticalPageTransformer implements ViewPager.PageTransformer {

    @Override
    public void transformPage(View view, float position) {

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);

        } else if (position <= 1) { // [-1,1]
            view.setAlpha(1);

            // Counteract the default slide transition
            view.setTranslationX(view.getWidth() * -position);

            //set Y position to swipe in from top
            float yPosition = position * view.getHeight();
            view.setTranslationY(yPosition);

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}

/**
 * Swaps the X and Y coordinates of your touch event.
 */
private MotionEvent swapXY(MotionEvent ev) {
    float width = getWidth();
    float height = getHeight();

    float newX = (ev.getY() / height) * width;
    float newY = (ev.getX() / width) * height;

    ev.setLocation(newX, newY);

    return ev;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
    boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
    swapXY(ev); // return touch coordinates to original reference frame for any child views
    return intercepted;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    return super.onTouchEvent(swapXY(ev));
  }

 }

【问题讨论】:

    标签: android android-fragments android-viewpager vertical-scrolling swiperefreshlayout


    【解决方案1】:

    嗯,这几天我一直在尝试解决这个问题,这很简单。只需将SwipeRefreshLayout 作为ViewPager 的父元素,然后使用OnPageChangeListener 在特定片段上禁用SwipeRefreshLayout,如下所示:

    //  viewpager change listener
     OnPageChangeListener viewPagerPageChangeListener = new OnPageChangeListener() {
    
      @Override
      public void onPageSelected(int position) {
    
         //for the 0th pos disable SwipeRefreshLayout;
         if(position != 0){
            swipeRefreshLayout.setEnabled(false);
         }else swipeRefreshLayout.setEnabled(true);
    
      }
    
      @Override
      public void onPageScrolled(int arg0, float arg1, int arg2) {
    
      }
    
      @Override
      public void onPageScrollStateChanged(int arg0) {
    
      }};
    

    【讨论】:

      【解决方案2】:

      不要在 ViewGroup 上扩展 SwipeRefesh,而是在 ViewPager 的每个 Fragment 中使用它。 现在解决此问题后,您需要检查 ViewPager 和 SwipeRefresh 的向下滚动手势。

      public class NEWSwipeRefresh extends SwipeRefreshLayout {
      
          private View mTargetView;
      
          public NEWSwipeRefresh(Context context) {
              this(context, null);
          }
      
          public NEWSwipeRefresh(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
          public void setTarget(View view) {
              mTargetView = view;
          }
      
          @Override
          public boolean canChildScrollUp() {
              if (mTargetView instanceof YOURVIEW) {
                  final StaggeredGridView absListView = (YOURVIEW)mTargetView;
                  return absListView.getChildCount() > 0
                          && (absListView.getFirstVisiblePosition() > 0 || absListView
                                  .getChildAt(0).getTop() < absListView
                                  .getPaddingTop());
              } else {
                  return super.canChildScrollUp();
              }
          }
      
      }
      

      通常滑动刷新返回 -1 并且它向它的父级提供滑动手势现在我在这里为 listview/gridview 覆盖它,以便它可以检查可见项目,如果它在顶部,那么它将向父级滑动或以其他方式它会给孩子们。

      【讨论】:

      • 你能给我一个样品吗?如何检查特定的滑动?我的活动也允许正常滑动。
      • 如何检测垂直视图寻呼机的垂直向下滑动?
      • @SimranBakshi 我写了一个使用 SwipeRefresh 和 listview/gridview 的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多