development

Android Pull-to-Refresh를 구현하는 방법

big-blog 2020. 2. 20. 23:31
반응형

Android Pull-to-Refresh를 구현하는 방법


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

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

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

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

어떤 추천?

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


마지막으로 구글은 풀투 리프레쉬 라이브러리의 공식 버전을 공개했다!

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);요구 사항에 따라 전화 할 수도 있습니다 .


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

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

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

<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);

 }

Google Now 또는 Gmail 애플리케이션과 같이 작업 표시 줄 위에 표시되는 새로운 유형의 '새로 고침'을 언급 한 사람은 없습니다.

정확히 동일하게 작동하는 ActionBar-PullToRefresh 라이브러리가 있습니다 .


Android 및 WP에서 구현할 때 해결해야 할 UX 문제가 있습니다.

"디자이너 / 개발자들이 iOS 앱 스타일로 풀 투 리프레쉬를 구현하지 않아야하는 이유에 대한 훌륭한 지표는 Google과 팀이 iOS에서이를 사용하는 동안 안드로이드에서 풀 투 리프레쉬를 사용하지 않는 방법입니다."

https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb


프로그램이 Android에 강제로 장착 된 iPhone 프로그램처럼 보이지 않게하려면보다 기본적인 모양과 느낌을 목표로 Gingerbread와 비슷한 작업을 수행하십시오.

대체 텍스트


https://github.com/guillep/PullToRefresh 구성 요소를 새로 고치려면 여기 에 목록 을 작성하십시오. 목록에 항목이 없으면 이벤트가 작동하고> = 1.6 안드로이드 폰에서 테스트했습니다.

어떤 제안이나 개선에 감사드립니다 :)


가장 좋은 라이브러리는 https://github.com/chrisbanes/Android-PullToRefresh 입니다.

와 일하다:

ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager

최신 Lollipop Pull-To Refresh를 받으려면

  1. 최신 Lollipop SDK 및 Extras / Android 지원 라이브러리 다운로드
  2. 프로젝트의 빌드 대상을 Android 5.0으로 설정하십시오 (그렇지 않으면 지원 패키지에 자원에 오류가있을 수 있음)
  3. libs / android-support-v4.jar을 21 번째 버전으로 업데이트하십시오.
  4. android.support.v4.widget.SwipeRefreshLayout플러스 사용android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener

자세한 안내는 여기에서 찾을 수 있습니다 : http://antonioleiva.com/swiperefreshlayout/

ListView의 canChildScrollUp()경우 주석에서 읽을 것을 권장합니다 .)


아주 재미있는 풀 - 투 - 새로 고침 하여 Yalantis . iOS 용 Gif이지만 확인할 수 있습니다 :)

<com.yalantis.pulltorefresh.library.PullToRefreshView
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
    android:id="@+id/list_view"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />


먼저 안드로이드에서 레이아웃을 새로 고치려면 Pull이 무엇인지 알아야합니다. 우리는 swipe-to-refresh로 android에서 pull to refresh를 호출 할 수 있습니다. 화면을 위에서 아래로 스 와이프하면 setOnRefreshListener에 따라 일부 작업이 수행됩니다.

다음은 새로 고침을 위해 Android 풀을 구현하는 방법을 보여주는 자습서 입니다. 이게 도움이 되길 바란다.

참고 URL : https://stackoverflow.com/questions/4583484/how-to-implement-android-pull-to-refresh



반응형