Android 프로젝트:pulltorefresh 오픈 소스 프로젝트 를 드 롭 다운 새로 고침 으로 확장 하여 더 많은 처리 방법 을 불 러 옵 니 다.listview 스크롤 방향 을 감청 합 니 다.

많은 안 드 로 이 드 애플 리 케 이 션 의 드 롭 다운 리 셋 은 pulltorefresh 라 는 오픈 소스 프로젝트 를 사용 하지만 확장 성 은 드 롭 다운 리 셋 과 함께 더 많이 끌 어 올 릴 때 한계 가 있 습 니 다.많은 곳 을 조사 한 결과 이 오픈 소스 프로젝트 가 잘 되 지 않 는 동시에 드 롭 다운 리 셋 과 상 라 로드 를 지원 하지 않 는 다 는 것 을 알 게 되 었 습 니 다.이 구성 요 소 는 mode 의 속성 이 있 습 니 다.both,즉 상하 로 동시에 끌 수 있 습 니 다.하지만 이 속성 만 설정 하면 위 당 김 과 아래 당 김 효과 가 완전히 일치 합 니 다.따라서 이 오픈 소스 프로젝트 를 사용 하여 드 롭 다운 새로 고침 을 하고 더 많이 끌 어 올 릴 수 있 으 려 면 코드 에서 처리 해 야 합 니 다.
===============================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
        
    }

이 글 은'하늘 에는 흔적 이 없 지만 나 는 날 아 간다'블 로그 에서 나 온 것 으로 작가 에 게 연락 하 세 요!

좋은 웹페이지 즐겨찾기