Android 드 롭 다운 리 셋 컨트롤 PullToRefresh 인 스 턴 스 분석

Android 에 서 는 상하 당 김 새로 고침 을 사용 하 는 경우 가 많 습 니 다.이것 은 자주 사용 하 는 기능 입 니 다.Android v4 패키지 에서 도 우리 에 게 원생 의 하 당 김 새로 고침 컨트롤 인 Swipe RefreshLayout 를 제공 합 니 다.이 를 통 해 간결 한 새로 고침 효 과 를 실현 할 수 있 습 니 다.그러나 오늘 우리 의 주인공 은 그것 이 아니 라 뜨 거 운 제3자 의 상하 당 김 새로 고침 컨트롤 인 PullToRefresh 입 니 다.PullToRefresh 는 PullToRefreshScrollView,PullToRefreshListView,PullToRefreshGridView 등 우리 에 게 제공 하 는 많은 컨트롤 을 포함 하고 xml 파일 에 컨트롤 로 직접 도입 할 수 있 습 니 다.
다른 제3자 라 이브 러 리 와 달리 PullToRefresh 의 사용 은 우리 가 하나의 module 를 참조 하여 의존 해 야 합 니 다.

그 다음 에 우리 프로젝트 의 설정 센터 에 들 어 갑 니 다.단축 키 는 ctrl+alt+shift+s 입 니 다.그리고 위아래 로 새로 고침 할 모듈 을 선택 하고 오른쪽 상단 의 플러스 번 호 를 클릭 하여 Module dependency 를 선택 하 십시오.


그리고'OK'를 누 르 고 조금 만 기다 리 면 이 라 이브 러 리 를 우리 프로젝트 에 추가 할 수 있 습 니 다.우 리 는 위아래 로 새로 고침 을 사용 할 수 있 습 니 다.
우리 가 도입 한 제3자 라 이브 러 리 의 디 렉 터 리 구 조 는 다음 과 같다.

xml 파일 에서 이 컨트롤 을 사용 할 때 가방 이름 을 사용 하 십시오.클래스 이름 형식 으로 사용 하고 자 하 는 컨트롤 을 참조 하 십시오.이렇게:
com.handmark.pulltorefresh.library.PullToRefreshListView
패키지 이름 은 우리 가 도입 한 라 이브 러 리 의 module 의 AndroidManifest 에서 볼 수 있 습 니 다.디 렉 터 리 에 있 는 자바 폴 더 의 클래스 는 우리 가 사용 할 클래스 입 니 다.여기 서 우 리 는 PullToRefreshListView 를 예 로 들 면 다른 컨트롤 의 사용 방법 은 유사 하 다.아주 징 그 러 운 것 은 컨트롤 안의 속성 에 코드 알림 이 없습니다.코드 알림 이 없습니다.코드 알림 이 없습니다!그래서 나 는 여러 번 대조 해 보 았 는데,내 가 모듈 을 잘못 부 었 다 고 생각 했 는데,결 과 는 코드 알림 이 없 었 기 때문이다.
우 리 는 먼저 몇 가지 비교적 중요 한 방법 을 살 펴 보 자. 

//           
 pullToRefreshListView.getRefreshableView();
 /**
 *        :      
 * PullToRefreshBase.Mode.BOTH //        
 * PullToRefreshBase.Mode.PULL_FROM_START //       
 * PullToRefreshBase.Mode.PULL_FROM_END //       
 *
 */
 pullToRefreshListView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
 //               
 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);

getRefreshableView()를 통 해 새로 고침 이 있 는 컨트롤(예 를 들 어 PullToRefreshListView 를 사용 할 때 이 방법 을 사용 하면 ListView 인 스 턴 스 를 되 돌려 줍 니 다)을 얻 을 때 해당 하 는 컨트롤 을 얻 을 수 있 습 니 다.예 를 들 어 ListView 는 listItem 의 클릭 이벤트 나 데이터 가 적당 하면 이 가 져 온 ListView 를 진행 할 수 있 습 니 다.
또 하나의 중요 한 방법 은 컨트롤 을 새로 고 칠 때의 감청 을 설정 하 는 것 이다. 
pullToRefreshListView.setOnRefreshListener()
그 는 두 개의 매개 변 수 를 전달 할 수 있 는데,하 나 는?
PullToRefreshBase.OnRefreshListener
인터페이스 에 대응 하 는 익명 내부 클래스 형식 입 니 다.네,맛 없어 요.
PullToRefreshBase.OnRefreshListener2
인터페이스 에 대응 하 는 익명 내부 클래스 형식 입 니 다.그 중에서 보통 상하 당 김 새로 고침 과 동시에 사용 할 수 있 을 때 우 리 는 두 번 째 형식 을 선택 합 니 다. 

pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
 //        
 @Override
 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {

 }

 //        
 @Override
 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

 }
 });

물론 PullToRefresh 의 또 다른 중요 한 방법 은 
pullToRefreshListView.onRefreshComplete();
이 방법 은 새로 고침 이 완료 되 었 음 을 알 리 고 새로 고침 을 취소 합 니 다.이 문장 을 추가 하지 않 으 면 새로 고침 애니메이션 이 계속 표 시 됩 니 다.여기 서 우 리 는 데 이 터 를 모 의 한 다음 에 드 롭 다운 으로 새로 고침 할 때 스 레 드 를 사용 하여 프로그램 을 2s 자게 한 다음 에 무 작위 로 새 데 이 터 를 불 러 오고 Adapter 에 UI 를 업데이트 하 라 고 알 립 니 다.완성 코드 는 다음 과 같 습 니 다. 

package ggcomic.rabbit.lx.pulltorefresh;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.LoadingLayoutProxy;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

 private PullToRefreshListView pullToRefreshListView;
 private ListView lv;
 private List<String> datas;
 private ArrayAdapter<String> adapter;
 private Handler handler=new Handler();
 private LoadingLayoutProxy llProxy;//            

 @Override

 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull);

 datas=new ArrayList<>();
 for(int i=1;i<=50;i++){
 datas.add("item---------"+i);
 }

 //           
 lv = pullToRefreshListView.getRefreshableView();
 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);
 lv.setAdapter(adapter);
 /**
 *        :      
 * PullToRefreshBase.Mode.BOTH //        
 * PullToRefreshBase.Mode.PULL_FROM_START //       
 * PullToRefreshBase.Mode.PULL_FROM_END //       
 *
 */
 pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
 //               
 pullToRefreshListView.setScrollingWhileRefreshingEnabled(true);

 pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
 //        
 @Override
 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
 new Thread(new Runnable() {
  @Override
  public void run() {
  try {
  //  2s
  Thread.sleep(2000);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }

  //           
  datas.add(0,"item-------"+(int)(Math.random()*100+1));
  handler.post(new Runnable() {
  @Override
  public void run() {
  adapter.notifyDataSetChanged();
  //         
  pullToRefreshListView.onRefreshComplete();
  }
  });
  }
 }).start();
 }

 //        
 @Override
 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {

 }
 });

 }
}

효과 도 는 다음 과 같 습 니 다: 

새로 고침 이 완 료 된 후 무 작위 로 항목 아 이 템-39 를 추가 한 것 을 볼 수 있 습 니 다.이렇게 리 셋 하면 완 료 됩 니 다.실제 프로젝트 에서 리 셋 된 감청 이벤트 에서 네트워크 요청 만 완료 하면 됩 니 다. 
이 외 에 도 리 셋 컨트롤 스타일 을 정의 할 수 있 습 니 다.다음 과 같이 전역 변수 Loading LayoutProxy 대상 을 정의 합 니 다. 
private LoadingLayoutProxy llProxy;  //새로 고침 컨트롤 새로 고침 의 텍스트 등 을 설정 하 는 대상
적당 한 위치 에서 예화 하고 사용자 정의 값 을 설정 합 니 다. 

layoutProxy = (LoadingLayoutProxy) pullToRefreshListView.getLoadingLayoutProxy(true, false);
 //          
 layoutProxy.setPullLabel("  ,     !");
 //              
 layoutProxy.setReleaseLabel("      ,   !");
 //            
 layoutProxy.setRefreshingLabel("     ~");
 //       
 layoutProxy.setLoadingDrawable(getResources().getDrawable(R.drawable.animatorss));

layoutProxy 초기 화 시 두 개의 매개 변 수 는 각각 어디 에 적용 되 는 지,첫 번 째 매개 변 수 는 머리 새로 고침 에 적용 되 는 지,두 번 째 매개 변 수 는 끝 에 적용 되 는 지 를 나 타 냅 니 다. 
새로 고침 할 때의 소리 도 정의 할 수 있 습 니 다. 
오디 오 파일 을 사용 하려 면 res 자원 파일 아래 raw 폴 더 를 새로 만 들 고 오디 오 파일 을 여기에 두 고 코드 에서 참조 해 야 합 니 다. 

SoundPullEventListener<ListView> soundEvend = new SoundPullEventListener<>(this);
 //  Flag        
 soundEvend.addSoundEvent(PullToRefreshBase.State.PULL_TO_REFRESH, R.raw.pull_event);
 //           
 soundEvend.addSoundEvent(PullToRefreshBase.State.RESET, R.raw.reset_sound);
 //        
 soundEvend.addSoundEvent(PullToRefreshBase.State.REFRESHING, R.raw.refreshing_sound);
 //            
 pullToRefreshListView.setOnPullEventListener(soundEvend);

이렇게 새로 고침 할 때 소리 도 나 는데 빨리 해 보 세 요~
참,PullToRefreshListView 를 사용 할 때 문제 가 발생 한 적 이 있 습 니 다.바로 ListItem 의 클릭 이벤트 의 매번 position 은-1 이 필요 해서 현재 아 이 템 과 대응 합 니 다.드 롭 다운 새로 고침 할 때 ListView 의 맨 위 에 항목 을 추가 한 것 과 같 기 때문에 해당 하 는 클릭 이 벤트 를 설정 할 때 position-1 을 주의해 야 합 니 다.
이것 은 PullToRefresh 의 library 입 니 다.위 에서 말 한 절차 에 따라 가 져 오 면 사용 할 수 있 습 니 다:링크:http://pan.baidu.com/s/1cqp9JS 비밀번호:a12j
이것 은 PullToRefresh 의 공식 데모 입 니 다.특히 관심 이 있 는 분 들 은 다운로드 해서 연구 해 보 세 요.http://pan.baidu.com/s/1ge8gerh 
물론 여기 서 우 리 는 PullToRefresh 를 간단하게 사용 할 뿐 리 셋 기능 을 실현 할 수 있 을 뿐 더 많은 맞 춤 형 제작 은 연구 해 야 합 니 다~ 
그리고 나 는 이 입문 문장 도 괜찮다 고 생각한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기