Android 프로젝트:pulltorefresh 오픈 소스 프로젝트 를 드 롭 다운 새로 고침 으로 확장 하여 더 많은 처리 방법 을 불 러 옵 니 다.listview 스크롤 방향 을 감청 합 니 다.
===============================pulltorefresh 속성 관련================================================
오픈 소스 프로젝트:Android-PullToRefresh
항목 주소:https://github.com/chrisbanes/Android-PullToRefresh/wiki/Quick-Start-Guide
1.속성:https://github.com/chrisbanes/Android-PullToRefresh/blob/master/library/res/values/attrs.xml
네 임 스페이스:xmlns:ptr="http://schemas.android.com/apk/res-auto"
ptr:ptrAnimationStyle
애니메이션 효 과 는 두 개의 값 flip 와 rotate 를 제공 합 니 다.기본 값 은 rotate 입 니 다.
ptr:ptrRefreshableViewBackground
새로 고침 View 배경 색 설정
ptr:ptrHeaderBackground
머리 뷰 배경 색 설정
ptr:ptrHeaderTextColor
머리 뷰 텍스트 색상 설정
ptr:ptrHeaderSubTextColor
머리 view 부제 텍스트 색상 설정
ptr:ptrMode
pullFromStart:pullFromEnd:both;
2.상용 방법
setOnRefreshListener(OnRefreshListener listener):리 셋 모니터 설정;
setOnLastItemVisibleListener(OnLastItemVisibleListener listener):모니터 의 위 치 를 설정 합 니 다.
setOnPullEventListener(OnPullEventListener listener);이벤트 모니터 설정 하기;
onRefreshComplete():설정 새로 고침 완료
===============================감청 리 스 트 뷰 스크롤 방향===================================================
위로 끌 어 올 리 기 위해 더 많은 관건 은 onrefresh 방법 이 실행 되 기 전에 listview 의 스크롤 방향 을 판단 하 는 것 입 니 다.다음 방법 은 시도 한 방법 중 가장 효과 가 좋 은 것 이다.완벽 한 해결 이 라 고 할 수 는 없 지만 효과 가 가장 가 까 운 것 같다.(첫 번 째 화면 데이터 줄 이 화면 에 가득 차지 않 거나 굴 러 갈 때 첫 번 째 줄 의 굴 러 가 는 거리 가 줄 보다 작 으 면 약간의 오차 가 있 을 수 있 습 니 다.그러나 대부분의 응용 목록 은 페이지 마다 화면 이 가득 하고 이 를 바탕 으로 다른 제스처 와 결합 하여 이 방법 을 개선 할 수 있다).
int mLastFirstVisibleItem = 0;
boolean mIsScrollingUp;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (view.getId() == mListView.getId())
{
final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem)
{
mIsUp = true;
}
else if (currentFirstVisibleItem < mLastFirstVisibleItem)
{
mIsUp = false;
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
참고 자료:http://stackoverflow.com/questions/12114963/detecting-the-scrolling-direction-in-the-adapter-up-down/12115157#12115157
=============================
json 을 분석 한 후 위로 당 기 는 동작 인지 아래로 당 기 는 새로 고침 동작 인지 판단 합 니 다.
// json
private void parseJson(String result)
{
List<ListJson> localList = parseJsonArray(Utils.parseListJson(result, "key"));
if(!mIsUp)
{
mDataList.clear();
}
mDataList.addAll(localList);
}
데이터 로드 가 끝 난 후 notifyDataSetChanged 와 Pull RefreshListView 를 알 리 는 동시에 페이지 번호 1 을 추가 합 니 다.
//
private void loadComplete()
{
mPullRefreshListView.onRefreshComplete();
mAdapter.notifyDataSetChanged();
mPage += 1;
}
위 당 김 과 아래 당 김 방향 을 판단 하고 listview 를 감청 하 며 머리 와 아래쪽 view 의 문자 설명 을 수정 합 니 다.
/**
* ******************* ************************
*/
// listview
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView)
{
// ,
String str = DateUtils.formatDateTime(getActivity(), System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
//
if (!mIsUp)
mPage = 0;
// ( )
if (mIsUp)
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel(" ");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(" :" + str);
}
else
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel(" ");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(" :" + str);
}
// ,
loadTask();
}
int mLastFirstVisibleItem = 0;
boolean mIsScrollingUp;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (view.getId() == mListView.getId())
{
final int currentFirstVisibleItem = mListView.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem)
{
mIsUp = true;
}
else if (currentFirstVisibleItem < mLastFirstVisibleItem)
{
mIsUp = false;
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
// ( )
if (mIsUp)
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel(" ");
}
else
{
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel(" ");
}
}
@Override
public void onLastItemVisible()
{
mIsUp = true;
}
=============================기타 사용 노트=========================================================
1.PullRefreshListView.setRefreshing()방법 으로 업 데 이 트 를 수행 할 수 없습니다.
@Override
protected void onRefreshing(final boolean doScroll) {
/**
* If we're not showing the Refreshing view, or the list is empty, the
* the header/footer views won't show so we use the normal method.
*/
/*ListAdapter adapter = mRefreshableView.getAdapter();
if (!mListViewExtrasEnabled || !getShowViewWhileRefreshing() || null == adapter || adapter.isEmpty()) {
super.onRefreshing(doScroll);
return;
}*/
super.onRefreshing(false);
}
}
mPullRefreshListView.setRefreshing();adapter 가 안에 있 는 size 가 null 이거 나 크기 가 0 이면
이 럴 때 setRefreshing 은 효과 가 없습니다.PullToRefreshListView 의 코드 주석 을 지 워 야 합 니 다.
2.OnRefreshListener 2
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.refresh_listview);
mListView = ((ListView) this.mPullRefreshListView.getRefreshableView());
// listview
mPullRefreshListView.setOnRefreshListener(this);
// mPullRefreshListView.setOnRefreshListener(this);
// mPullRefreshListView.setOnLastItemVisibleListener(this);
// mPullRefreshListView.setOnScrollListener(this);
mPullRefreshListView.setOnItemClickListener(this);
해당 인터페이스 방법:
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView)
{
//
String str = DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
// ( )
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel(" ");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(" :" + str);
onPullDownListView();
}
public void onPullDownListView()
{
// TODO Auto-generated method stub
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView)
{
//
String str = DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_NO_NOON);
// ( )
mPullRefreshListView.getLoadingLayoutProxy().setRefreshingLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setPullLabel(" ");
mPullRefreshListView.getLoadingLayoutProxy().setReleaseLabel(" ");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(" :" + str);
onPullUpListView();
}
public void onPullUpListView()
{
// TODO Auto-generated method stub
}
이 글 은'하늘 에는 흔적 이 없 지만 나 는 날 아 간다'블 로그 에서 나 온 것 으로 작가 에 게 연락 하 세 요!