Android 사용자 정의 컨트롤 ListView 드 롭 다운 새로 고침 코드

ListView 는 실제 실 용적 으로 새로 고침 과 위로 끌 어 올 리 는 동적 효과 가 있 습 니 다.오늘 배 울 것 은 새로 고침 을 가 진 ListView 를 어떻게 사용자 정의 하 는 지 입 니 다.
원리 해석:일반적으로 드 롭 다운 새로 고침 이 있 는 listview 를 네 가지 서로 다른 상태 로 나 누 어 서로 다른 디 스 플레이 효 과 를 냅 니 다.
완료 상태 done:listview 정상 표시 상태
  • 2.드 롭 다운 상태 pull:listview 가 드 롭 다운 되 고 있 을 때의 상태
  • 3.방출 상태 release:listview 드 롭 다운 후 풀 린 상태
  • 업데이트 상태 refreshing:listview 드 롭 다운 후 데 이 터 를 불 러 올 때의 상태실현 절차:
  • 사용자 정의 CustomListView 는 ListView 에서 계승 되 고 header View 를 추가 합 니 다.그 안의 구 조 는 드 롭 다운 새로 고침 문자 와 그림 이 있 습 니 다
  • 4.567917.listview 에 어댑터 를 만 들 고 데이터 원본 을 만들어 listview 어댑터 에 넣 으 면 테스트 할 수 있 습 니 다
  • 사용자 정의 머리 가 있 는 ListView 는 먼저 머리 보 기 를 숨 기 고 머리 보 기 를 추가 하 는 코드 는 listview.addHeaderView()입 니 다
  • 4.567917.주의:header View 대상 의 set Visibility()로 숨겨 진 효 과 를 실현 할 수 없습니다.이 머리 보 기 를 추가 하 는 방법 을 호출 할 때 머리 위 치 는 보기 가 있 든 없 든 한 위 치 를 차지 합 니 다.그래서 setPadding()의 TOP 을 마이너스 로 하여 이 기능 을 실현 해 야 합 니 다구체 적 인 코드 실현
    
    package com.hapzhu.customlv;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    public class CustomListview extends ListView {
      View headerView;
      int height;
      private TextView tvActionTip;
      private ImageView ivArrow;
      private ProgressBar pbRefreshing;
      final static int STATE_DONE = 1;
      final static int STATE_PULL = 2;
      final static int STATE_RELEASE = 3;
      final static int STATE_REFRESHING = 4;
      int currentState;
      int downY;
      public CustomListview(Context context, AttributeSet attrs) {
        super(context, attrs);
        headerView = View.inflate(context, R.layout.listview_header, null);
        this.addHeaderView(headerView);
        //  setPadding    Top     headerview   
        //    GetHeight     ,                 
        //   measureHeight        ,        0,0   
        headerView.measure(0, 0);
        height = headerView.getMeasuredHeight();
        headerView.setPadding(0, -height, 0, 0);
        initView();
        //        
        currentState = STATE_DONE;
      }
      private void initView() {
        tvActionTip = (TextView) headerView.findViewById(R.id.tv_state);
        ivArrow = (ImageView) headerView.findViewById(R.id.iv_arrow);
        pbRefreshing = (ProgressBar) headerView.findViewById(R.id.progressBar);
      }
      boolean isRefresh = false;
      @Override
      public boolean onTouchEvent(MotionEvent ev) {
        try {
          //     
          int action = ev.getAction();
          switch (action) {
          case MotionEvent.ACTION_DOWN://       
            if (currentState == STATE_DONE) {//                
              //        Y  
              downY = (int) ev.getY();
              //     
              currentState = STATE_PULL;
            }
            break;
          case MotionEvent.ACTION_MOVE://        
            if (currentState == STATE_PULL) {//              
              int currentY = (int) ev.getY();//            Y  
              int top = currentY - downY - height;//                 ,     
              headerView.setPadding(0, top, 0, 0);
              if (currentY - downY > height) {//                 ,     
                currentState = STATE_RELEASE;
                tvActionTip.setText("    ");
              }
            }
            break;
          case MotionEvent.ACTION_UP:
            if (currentState == STATE_RELEASE) {//                
              tvActionTip.setText("   ");//        
              currentState = STATE_REFRESHING;//     ,      
              ivArrow.setVisibility(GONE);//     
              pbRefreshing.setVisibility(VISIBLE);//      
              isRefresh = true;
              if(onRefreshListener!=null){
                //         ,        
                onRefreshListener.OnRefresh(this);
              }
            } else {
              if (!isRefresh) {
                //               ,        
                headerView.setPadding(0, -height, 0, 0);
                //            ,          
                currentState = STATE_DONE;
              }
            }
            break;
          }
        } catch (Exception e) {
        }
        return super.onTouchEvent(ev);
      }
      // 1    
      interface OnRefreshListener {
        //            Custom             
        public void OnRefresh(CustomListview customLv);
      }
      // 2.    
      OnRefreshListener onRefreshListener;
      // 3.    
      public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
        this.onRefreshListener = onRefreshListener;
      }
      public void refreshComplete(){
        isRefresh=false;
        //       ,       
        headerView.setPadding(0, -height, 0, 0);
        //            ,          
        currentState = STATE_DONE;
        //         ,       ,      
        ivArrow.setVisibility(VISIBLE);//     
        pbRefreshing.setVisibility(GONE);//      
        tvActionTip.setText("    ");//        
      }
    }
    오늘 UML 그림 을 새로 배 워 서 이 상태 그림 을 그 렸 습 니 다.

    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

    좋은 웹페이지 즐겨찾기