Android Pull-to-Refresh를 구현하는 방법 생각할 수있는 몇

Twitter (공식 앱)와 같은 Android 애플리케이션에서 ListView가 표시되면 컨텐츠를 새로 고치기 위해 풀다운 (해제시 바운스) 될 수 있습니다.

귀하의 의견으로는 그것을 구현하는 가장 좋은 방법이 무엇인지 궁금합니다.

내가 생각할 수있는 몇 가지 가능성 :

  1. ListView 상단의 항목-그러나 ListView에서 애니메이션을 사용하여 항목 위치 1 (0 기반)로 다시 스크롤하는 것은 쉬운 일이 아니라고 생각합니다.
  2. ListView 외부의 다른보기-ListView를 가져올 때 ListView 위치를 아래로 이동해야합니다 .ListView에 대한 드래그 터치가 여전히 ListView의 항목을 실제로 스크롤하는지 감지 할 수 있는지 확실하지 않습니다.

어떤 추천?

추신 : 나는 공식 트위터 앱 소스 코드가 언제 출시되는지 궁금합니다. 출시 될 것이라고 언급되었지만 6 개월이 지났으며 그 이후로는 그 소식을 듣지 못했습니다.



답변

마지막으로 Google은 새로 고침 풀 라이브러리의 공식 버전을 출시했습니다!

SwipeRefreshLayout지원 라이브러리 내에서 이라고 하며 설명서는 다음과 같습니다.

  1. SwipeRefreshLayout레이아웃을 새로 고치기 위해 풀로 취급되는 뷰의 부모로 추가하십시오 . (내가했다 ListView예를 들어, 어떤 일 수있다 View처럼 LinearLayout, ScrollView등)

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.v4.widget.SwipeRefreshLayout>
  2. 수업에 리스너 추가

    protected void onCreate(Bundle savedInstanceState) {
        final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
        pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshData(); // your code
                pullToRefresh.setRefreshing(false);
            }
        });
    }

pullToRefresh.setRefreshing(true/false);요구 사항에 따라 전화 할 수도 있습니다 .

최신 정보

Android 지원 라이브러리는 더 이상 사용되지 않으며 AndroidX로 대체되었습니다. 새 라이브러리에 대한 링크는 여기 에서 찾을 수 있습니다 .

또한 프로젝트에 다음과 같은 종속성을 추가해야합니다.

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'

또는

Refactor >> Migrate to AndroidX로 이동하면 Android Studio가 종속성을 처리합니다.


답변

Pull to Refresh 구성 요소를 구현하려고 시도 했지만 완전 하지는 않지만 가능한 구현 방법을 보여줍니다 ( https://github.com/johannilsson/android-pulltorefresh) .

메인 로직이 PullToRefreshListView확장 되어 구현 됩니다 ListView. 내부적으로 smoothScrollBy(API 레벨 8)을 사용하여 헤더보기의 스크롤을 제어합니다 . 위젯은 이제 1.5 이상을 지원하도록 업데이트되었습니다. README 1.5 지원을 읽으십시오.

레이아웃에서 단순히 다음과 같이 추가하십시오.

<com.markupartist.android.widget.PullToRefreshListView
    android:id="@+id/android:list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    />

답변

또한 강력한 오픈 소스, 사용하기 쉽고 사용자 정의가 가능한 Android 용 PullToRefresh 라이브러리를 구현했습니다. 프로젝트 페이지의 문서에 설명 된대로 ListView를 PullToRefreshListView로 바꿀 수 있습니다.

https://github.com/erikwt/PullToRefresh-ListView


답변

내가 생각하는 가장 쉬운 방법은 안드로이드 지원 라이브러리에서 제공하는 것입니다.

android.support.v4.widget.SwipeRefreshLayout;

일단 가져 오면 레이아웃을 다음과 같이 정의 할 수 있습니다.

  <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    <android.support.v7.widget.RecyclerView
        xmlns:recycler_view="http://schemas.android.com/apk/res-auto"
        android:id="@android:id/list"
        android:theme="@style/Theme.AppCompat.Light"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/button_material_light"
        >

    </android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>

listview 대신 recycler view를 사용한다고 가정합니다. 그러나 listview는 여전히 작동하므로 recyclerview를 listview로 바꾸고 Java 코드 (Fragment)의 참조를 업데이트하면됩니다.

활동 단편에서 먼저 인터페이스를 구현하십시오 SwipeRefreshLayout.OnRefreshListener. i, e

public class MySwipeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout swipeRefreshLayout;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item, container, false);
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        swipeRefreshLayout.setOnRefreshListener(this);
}


 @Override
  public void onRefresh(){
     swipeRefreshLayout.setRefreshing(true);
     refreshList();
  }
  refreshList(){
    //do processing to get new data and set your listview's adapter, maybe  reinitialise the loaders you may be using or so
   //when your data has finished loading, cset the refresh state of the view to false
   swipeRefreshLayout.setRefreshing(false);

   }
}

이것이 대중을 돕는 희망


답변

이 링크에서는 유명한 포크 찾을 수 있습니다 PullToRefresh새로운 흥미와 같은 구현이보기 PullTorRefreshWebView또는 PullToRefreshGridView또는를 추가 할 수있는 가능성이 PullToRefresh목록의 하단에 있습니다.

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

그리고 가장 좋은 점은 Android 4.1에서 완벽하게 작동한다는 것입니다 (정상 PullToRefresh작동하지 않습니다)


답변

이 작업을 수행하는 매우 쉬운 방법이 있지만 이제는 그 확실한 방법을 확인하십시오. 내 코드 PullDownListView.java가 있습니다.

package com.myproject.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

/**
 * @author Pushpan
 * @date Nov 27, 2012
 **/
public class PullDownListView extends ListView implements OnScrollListener {

    private ListViewTouchEventListener mTouchListener;
    private boolean pulledDown;

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

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

    public PullDownListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setOnScrollListener(this);
    }

    private float lastY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            lastY = ev.getRawY();
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            float newY = ev.getRawY();
            setPulledDown((newY - lastY) > 0);
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (isPulledDown()) {
                        if (mTouchListener != null) {
                            mTouchListener.onListViewPulledDown();
                            setPulledDown(false);
                        }
                    }
                }
            }, 400);
            lastY = newY;
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            lastY = 0;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        setPulledDown(false);
    }

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

    public interface ListViewTouchEventListener {
        public void onListViewPulledDown();
    }

    public void setListViewTouchListener(
            ListViewTouchEventListener touchListener) {
        this.mTouchListener = touchListener;
    }

    public ListViewTouchEventListener getListViewTouchListener() {
        return mTouchListener;
    }

    public boolean isPulledDown() {
        return pulledDown;
    }

    public void setPulledDown(boolean pulledDown) {
        this.pulledDown = pulledDown;
    }
}

이 ListView를 사용하고 리스너를 설정하려는 활동에 ListViewTouchEventListener를 구현하면됩니다.

PullDownListViewActivity에서 구현했습니다.

package com.myproject.activities;

import android.app.Activity;
import android.os.Bundle;

/**
 * @author Pushpan
 *
 */
public class PullDownListViewActivity extends Activity implements ListViewTouchEventListener {

    private PullDownListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listView = new PullDownListView(this);
        setContentView(listView);
        listView.setListViewTouchListener(this);

        //setItems in listview
    }

    public void onListViewPulledDown(){
        Log.("PullDownListViewActivity", "ListView pulled down");
    }
}

그것은 나를 위해 작동합니다 🙂


답변

안드로이드 Pull-to-Refresh를 구현하려면이 코드를 사용해보십시오.

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</android.support.v4.widget.SwipeRefreshLayout>

활동 클래스 :

ListView lv = (ListView) findViewById(R.id.lv);
SwipeRefreshLayout pullToRefresh = (SwipeRefreshLayout) findViewById(R.id.pullToRefresh);


lv.setAdapter(mAdapter);

pullToRefresh.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh() {
            // TODO Auto-generated method stub

            refreshContent();

        }
    });



private void refreshContent(){

     new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                pullToRefresh.setRefreshing(false);
            }
        }, 5000);

 }