web-dev-qa-db-ja.com

SwipeRefreshLayout-下にスワイプして更新しますが、ビューのプルダウンは移動しません

出来ますか ??タイトル通り

レイアウトを更新するには下にスワイプしますレイアウトを固定して、スワイプ操作に沿って下に移動しないでください

ありがとう-私はSwipeRefreshLayoutを使用しています

11
Jongz Puangput

試行錯誤の末、私は

http://www.dailydevbook.de/Android-swiperefreshlayout-without-overscroll/

それを達成するために、SwipeRefreshLayoutを実装できる人向け


ステップ1:[〜#〜]ダウンロード[〜#〜]Androidサポートv4(オープンソース)githubから

ステップ2:[〜#〜] copy [〜#〜]以下のJavaプロジェクトのクラスへのクラス

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

note1-(オリジナルとの混同を防ぐためにSwipeRefreshLayoutをmySwipeRefreshLayoutにリファクタリングする)note2-(これらのクラスを修正し、v4の代わりに互いにソースを使用する)

ステップ3:UPDATE CODE使用

  • mySwipeRefreshLayoutの代わりに
  • SwipeRefreshLayout

ステップ4:UPDATE LAYOUT使用

  • com--yourpackage.mySwipeRefreshLaoutの代わりに
  • Android.support.v4.widget.SwipeRefreshLayout

ステップ5:mySwipeRefreshLayout.Javaでを見つけて次のコードに変更します

private  void  updateContentOffsetTop ( int  targetTop) {
        final  int  currentTop = mTarget.getTop ();
        if  (targetTop> mDistanceToTriggerSync) {
            targetTop = ( int ) mDistanceToTriggerSync;
        } else  if  (targetTop < 0 ) {
            targetTop = 0 ;
        }
        // SetTargetOffsetTopAndBottom (targetTop - currentTop);
        setTargetOffsetTopAndBottom ( 0 ); // MOD: Prevent Scroll Down Animation
    }
12
Jongz Puangput

あなたはこの方法を試します

listView.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    boolean enable = false;
    if(listView != null && listView.getChildCount() > 0){
        // check if the first item of the list is visible
        boolean firstItemVisible = listView.getFirstVisiblePosition() == 0;
        // check if the top of the first item is visible
        boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0;
        // enabling or disabling the refresh layout
        enable = firstItemVisible && topOfFirstItemVisible;
    }
    swipeRefreshLayout.setEnabled(enable);
}});

このコードは、listViewにpaddingTopがある場合は機能しません

23
Cabezas

回避策についてJongz Puangputに感謝しますが、別の解決策を提案したいと思います。

SwipeRefreshLayoutの子のプルダウンを防ぐために、次のようにoffsetTopAndBottomメソッドをオーバーライドした独自の子ビューを提供できます。

public class FixedRelativeLayout extends RelativeLayout {

    ...

    @Override
    public void offsetTopAndBottom(int offset) {
        // Ignoring movement from SwipeRefreshLayout
        super.offsetTopAndBottom(0);
    }

}

それは私にとってはうまくいきます、それが誰かを助けることを願っています。

4
Alex Vasilkov

私も同じ問題に直面していました。これを試して:

guidesList.setOnScrollListener(new AbsListView.OnScrollListener() {  
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int   visibleItemCount, int totalItemCount) {

        int topRowVerticalPosition = (guidesList == null || 
            guidesList.getChildCount() == 0) ? 0 : guidesList.getChildAt(0).getTop();

        swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0);
    }
});
4
Noman

現在上部にあるリサイクラービューを確認できます。また、SwipeRefreshLayoutを無効または有効にできることを理解することで、例を挙げましょう。

線形レイアウトマネージャーまたはグリッドを使用するとし、そこからリサイクル業者の位置を見つけることができます

        LinearLayoutManager mLayoutManager;
        if (mColumnCount <= 1) {
            mLayoutManager = new LinearLayoutManager(getBaseContext());
        } else {
            mLayoutManager = new GridLayoutManager(getBaseContext(), mColumnCount);
        }

        recyclerAdapter = new RecyclerViewAdapter(allData);
        mRecycler.setAdapter(recyclerAdapter);
        mRecycler.setLayoutManager(layoutManager);

        if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
            swipeRefreshLayout.setEnabled(true);
        }
        else{
            swipeRefreshLayout.setEnabled(false);
        }

したがって、リサイクラースクロールは正常に機能し、上部に到達した場合、swipeRefreshLayoutが更新イベントを処理します...

0