Android Pull-to-Refresh를 구현하는 방법
Twitter (공식 앱)와 같은 Android 애플리케이션에서 ListView가 표시되면 컨텐츠를 새로 고치기 위해 풀다운 (해제시 바운스) 될 수 있습니다.
귀하의 의견으로는 그것을 구현하는 가장 좋은 방법이 무엇인지 궁금합니다.
내가 생각할 수있는 몇 가지 가능성 :
- ListView 상단에있는 항목이지만 ListView에서 애니메이션을 사용하여 항목 위치 1 (0 기반)로 다시 스크롤하는 것은 쉬운 일이 아니라고 생각합니다.
- ListView 외부의 다른보기-ListView를 가져올 때 ListView 위치를 아래로 이동해야합니다 .ListView에 대한 드래그 터치가 여전히 ListView의 항목을 실제로 스크롤하는지 감지 할 수 있는지 확실하지 않습니다.
어떤 추천?
추신 : 나는 공식 트위터 앱 소스 코드가 언제 출시되는지 궁금합니다. 출시 될 것이라고 언급되었지만 6 개월이 지났으며 그 이후로는 그 소식을 듣지 못했습니다.
마지막으로 구글은 풀투 리프레쉬 라이브러리의 공식 버전을 공개했다!
SwipeRefreshLayout
지원 라이브러리 내에서 이라고 하며 설명서는 다음과 같습니다.
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>
수업에 리스너 추가
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
.
내부적으로 위젯은 이제 1.5 이상을 지원하도록 업데이트되었습니다. 1.5 지원을위한 README를 읽으십시오.smoothScrollBy
(API 레벨 8)을 사용하여 헤더보기의 스크롤을 제어합니다
.
레이아웃에서 간단히 다음과 같이 추가하십시오.
<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를 받으려면
- 최신 Lollipop SDK 및 Extras / Android 지원 라이브러리 다운로드
- 프로젝트의 빌드 대상을 Android 5.0으로 설정하십시오 (그렇지 않으면 지원 패키지에 자원에 오류가있을 수 있음)
- libs / android-support-v4.jar을 21 번째 버전으로 업데이트하십시오.
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
'development' 카테고리의 다른 글
C #에서 여러 공백을 단일 공백으로 바꾸는 방법은 무엇입니까? (0) | 2020.02.20 |
---|---|
Xcode 제품-> 아카이브 비활성화 (0) | 2020.02.20 |
루비에서 맵과 수집의 차이점은 무엇입니까? (0) | 2020.02.20 |
StackOverflowError는 무엇입니까? (0) | 2020.02.20 |
RESTful 검색 / 필터링을 설계하는 방법은 무엇입니까? (0) | 2020.02.20 |