Android 오픈 소스 프로젝트 PullToRefresh 드 롭 다운 리 셋 기능 상세 설명

먼저 효과 도 보기:

오픈 소스 항목 주소:https://github.com/chrisbanes/Android-PullToRefresh 
드 롭 다운 리 셋 이라는 기능 을 우 리 는 모두 비교적 흔히 볼 수 있 는데,오늘 소개 한 것 이 바로 이 기능 의 실현 이다.저 는 이 소스 라 이브 러 리 의 범례 에 따라 조금씩 소개 하 겠 습 니 다.오늘 은 비교적 흔히 볼 수 있 는 PullToRefreshListView 를 소개 하 는 것 입 니 다.이것 은 listView 가 드 롭 다운 새로 고침 기능 을 가지 도록 하 는 것 입 니 다. 
1.프로젝트 패 키 지 를 다운로드 하고 library 패 키 지 를 가 져 오 면 됩 니 다.다른 패 키 지 는 잠시 사용 하지 않 습 니 다.
2.소스 코드 를 분석 하고 우리 가 설정 할 수 있 는 것 이 무엇 인지 봅 시다. 

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <declare-styleable name="PullToRefresh">

 <!-- A drawable to use as the background of the Refreshable View -->
 <!--     view    -->
 <attr name="ptrRefreshableViewBackground" format="reference|color" />

 <!-- A drawable to use as the background of the Header and Footer Loading Views -->
 <!--     view    -->
 <attr name="ptrHeaderBackground" format="reference|color" />

 <!-- Text Color of the Header and Footer Loading Views -->
 <!--     /        -->
 <attr name="ptrHeaderTextColor" format="reference|color" />

 <!-- Text Color of the Header and Footer Loading Views Sub Header -->
 <!--     /           -->
 <attr name="ptrHeaderSubTextColor" format="reference|color" />

 <!-- Mode of Pull-to-Refresh that should be used -->
 <!--          ,       。     ,     ,     ,    ,        -->
 <attr name="ptrMode">
  <flag name="disabled" value="0x0" />
  <flag name="pullFromStart" value="0x1" />
  <flag name="pullFromEnd" value="0x2" />
  <flag name="both" value="0x3" />
  <flag name="manualOnly" value="0x4" />

  <!-- These last two are depreacted -->
  <!--          ,         -->
  <flag name="pullDownFromTop" value="0x1" />
  <flag name="pullUpFromBottom" value="0x2" />
 </attr>

 <!-- Whether the Indicator overlay(s) should be used -->
 <!--          -->
 <attr name="ptrShowIndicator" format="reference|boolean" />

 <!-- Drawable to use as Loading Indicator. Changes both Header and Footer. -->
 <!--         -->
 <attr name="ptrDrawable" format="reference" />

 <!-- Drawable to use as Loading Indicator in the Header View. Overrides value set in ptrDrawable. -->
 <!--          ,      ptrDrawable       -->
 <attr name="ptrDrawableStart" format="reference" />

 <!-- Drawable to use as Loading Indicator in the Fooer View. Overrides value set in ptrDrawable. -->
 <!--          ,      ptrDrawable       -->
 <attr name="ptrDrawableEnd" format="reference" />

 <!-- Whether Android's built-in Over Scroll should be utilised for Pull-to-Refresh. -->
 <attr name="ptrOverScroll" format="reference|boolean" />

 <!-- Base text color, typeface, size, and style for Header and Footer Loading Views -->
 <!--           -->
 <attr name="ptrHeaderTextAppearance" format="reference" />

 <!-- Base text color, typeface, size, and style for Header and Footer Loading Views Sub Header -->
 <!--            -->
 <attr name="ptrSubHeaderTextAppearance" format="reference" />

 <!-- Style of Animation should be used displayed when pulling. -->
 <!--            ,   rotate -->
 <attr name="ptrAnimationStyle">
  <flag name="rotate" value="0x0" />
  <flag name="flip" value="0x1" />
 </attr>

 <!-- Whether the user can scroll while the View is Refreshing -->
 <!--            ,   true -->
 <attr name="ptrScrollingWhileRefreshingEnabled" format="reference|boolean" />

 <!--
  Whether PullToRefreshListView has it's extras enabled. This allows the user to be 
  able to scroll while refreshing, and behaves better. It acheives this by adding
  Header and/or Footer Views to the ListView.
 -->
 <!--    listview    /    -->
 <attr name="ptrListViewExtrasEnabled" format="reference|boolean" />

 <!--
  Whether the Drawable should be continually rotated as you pull. This only
  takes effect when using the 'Rotate' Animation Style.
 -->
 <!--    rotate ,                 -->
 <attr name="ptrRotateDrawableWhilePulling" format="reference|boolean" />

 <!-- BELOW HERE ARE DEPRECEATED. DO NOT USE. -->
 <attr name="ptrAdapterViewBackground" format="reference|color" />
 <attr name="ptrDrawableTop" format="reference" />
 <attr name="ptrDrawableBottom" format="reference" />
 </declare-styleable>

</resources>

설정 할 수 있 는 속성 이 이렇게 많은 것 을 보 았 으 니 정말 맞 춤 형 으로 만 들 수 있다 고 생각 하지 마 세 요.진정 으로 맞 춤 형 제작 을 하려 면 layot 에서 새로 고침 레이아웃 을 바 꿔 야 합 니 다. 

3.그것 으로 자신의 공 사 를 시작 합 니 다.
 레이아웃 파일 설정
 PullToRefreshListView 삽입

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="${relativePackage}.${activityClass}" 
 android:background="#000000">

<!-- The PullToRefreshListView replaces a standard ListView widget. -->

 <com.handmark.pulltorefresh.library.PullToRefreshListView
 xmlns:ptr="http://schemas.android.com/apk/res-auto"
 android:id="@+id/pull_refresh_list"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:cacheColorHint="#000000"
 android:divider="#19000000"
 android:dividerHeight="4dp"
 android:fadingEdge="none"
 android:fastScrollEnabled="false"
 android:footerDividersEnabled="false"
 android:headerDividersEnabled="false"
 android:smoothScrollbar="true" 
 ptr:ptrAnimationStyle="rotate"
 ptr:ptrHeaderTextColor="#ffffff"
 ptr:ptrHeaderSubTextColor="#00ffff"
 ptr:ptrHeaderBackground="@null"
 ptr:ptrDrawable="@drawable/ic_launcher"/>
 
</RelativeLayout>

코드 작성 시작 
1.이 컨트롤 을 찾 고 모니터 를 설정 합 니 다. 
이 안 에는 날짜 의 도구 류 가 사용 되 었 는데,사실은 지난번 드 롭 다운 시간 을 설정 한 것 이다.또한 드 롭 다운 후 비동기 퀘 스 트 가 실 행 됩 니 다. 

 /**
 *        listview   
 */
 private void initPTRListView() {
 mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
 //       
 mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {

  @Override
  public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  //             
  String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
   DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);

  //      label
  refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  //         ,            
  new GetDataTask(mPullRefreshListView, mAdapter,mListItems).execute();
  }
 });

 //            
 mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
  
  @Override
  public void onLastItemVisible() {
  Toast.makeText(getApplication(), "     ", Toast.LENGTH_SHORT).show();
  }
 });
 
 //mPullRefreshListView.isScrollingWhileRefreshingEnabled();//          
 //          
 mPullRefreshListView.setScrollingWhileRefreshingEnabled(true);
 //mPullRefreshListView.getMode();//    
 //          。       :Mode.PULL_FROM_START,Mode.BOTH,PULL_FROM_END
 mPullRefreshListView.setMode(Mode.BOTH);
 
 /**
  *       
  */
 SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(this);
 soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
 soundListener.addSoundEvent(State.RESET, R.raw.reset_sound);
 soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
 mPullRefreshListView.setOnPullEventListener(soundListener);
 }

2.위 에 있 는 컨트롤 에서 listView 를 얻 고 어댑터 를 설정 합 니 다. 

 //   listview  
 private ListView actualListView;
 //        ,   string  ,         string       
 private LinkedList<String> mListItems;
 // listview          
 private ArrayAdapter<String> mAdapter;

링크 목록 의 대상 을 사 용 했 습 니 다.이것 은 Array List 와 유사 한 링크 배열 로 시작 과 끝 에 String 을 추가 하 는 것 이 편리 합 니 다. 

 /**
 *   listview    
 */
 private void initListView() {
 //  getRefreshableView()     listview  
 actualListView = mPullRefreshListView.getRefreshableView();
 
 String []data = new String[] {"android","ios","wp","java","c++","c#"};
 mListItems = new LinkedList<String>();
 // string    string      
 mListItems.addAll(Arrays.asList(data));
 
 mAdapter = new ArrayAdapter<>(getApplicationContext(), 
  android.R.layout.simple_list_item_1, mListItems);
 actualListView.setAdapter(mAdapter);
 }

 
3.네트워크 에서 데 이 터 를 불 러 오 는 것 을 모방 하기 위해 비동기 작업 을 작성 합 니 다.
여기 서 주의해 야 할 것 은 불 러 온 후에 새로 고침 완료 와 어댑터 변경 을 알 리 는 방법 을 출발 해 야 합 니 다.

package com.kale.ptrlistviewtest;

import java.util.LinkedList;

import android.os.AsyncTask;
import android.widget.ArrayAdapter;

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

/**
 * @author:Jack Tony
 * @tips :               ,    
 * @date :2014-10-14
 */
public class GetDataTask extends AsyncTask<Void, Void, Void>{

 private PullToRefreshListView mPullRefreshListView;
 private ArrayAdapter<String> mAdapter;
 private LinkedList<String> mListItems;
 
 public GetDataTask(PullToRefreshListView listView,
  ArrayAdapter<String> adapter,LinkedList<String> listItems) {
 // TODO            
 mPullRefreshListView = listView;
 mAdapter = adapter;
 mListItems = listItems;
 }
 
 @Override
 protected Void doInBackground(Void... params) {
 //    
 try {
  Thread.sleep(2000);
 } catch (InterruptedException e) {
 }
 return null;
 }
 
 @Override
 protected void onPostExecute(Void result) {
 // TODO          
 super.onPostExecute(result);
 //       
 Mode mode = mPullRefreshListView.getCurrentMode();
 if(mode == Mode.PULL_FROM_START) {
  mListItems.addFirst("         ");
 }
 else {
  mListItems.addLast("         ");
 }
 //        
 mAdapter.notifyDataSetChanged();
 //          
 mPullRefreshListView.onRefreshComplete();
 
 }
 


}

acitivty 의 모든 코드 를 붙 입 니 다. 
MainActivity.java 

package com.kale.ptrlistviewtest;

import java.util.Arrays;
import java.util.LinkedList;

import android.app.Activity;
import android.os.Bundle;
import android.text.format.DateUtils;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnLastItemVisibleListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.State;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import com.handmark.pulltorefresh.library.extras.SoundPullEventListener;

public class MainActivity extends Activity {
 
 //         listView  
 private PullToRefreshListView mPullRefreshListView;
 //   listview  
 private ListView actualListView;
 //        ,   string  ,         string       
 private LinkedList<String> mListItems;
 // listview          
 private ArrayAdapter<String> mAdapter;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 initView();

 //          ,              
 mPullRefreshListView.setRefreshing(true);
 //new GetDataTask(mPullRefreshListView, mAdapter, mListItems).execute();
 //mPullRefreshListView.setRefreshing(false);

 }

 private void initView() {
 initPTRListView();
 initListView();
 }
 
 /**
 *        listview   
 */
 private void initPTRListView() {
 mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
 //       
 mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {

  @Override
  public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  //             
  String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
   DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);

  //      label
  refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  //         ,            
  new GetDataTask(mPullRefreshListView, mAdapter,mListItems).execute();
  }
 });

 //            
 mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
  
  @Override
  public void onLastItemVisible() {
  Toast.makeText(getApplication(), "     ", Toast.LENGTH_SHORT).show();
  }
 });
 
 //mPullRefreshListView.isScrollingWhileRefreshingEnabled();//          
 //          
 mPullRefreshListView.setScrollingWhileRefreshingEnabled(true);
 //mPullRefreshListView.getMode();//    
 //          。       :Mode.PULL_FROM_START,Mode.BOTH,PULL_FROM_END
 mPullRefreshListView.setMode(Mode.BOTH);
 
 /**
  *       
  */
 SoundPullEventListener<ListView> soundListener = new SoundPullEventListener<ListView>(this);
 soundListener.addSoundEvent(State.PULL_TO_REFRESH, R.raw.pull_event);
 soundListener.addSoundEvent(State.RESET, R.raw.reset_sound);
 soundListener.addSoundEvent(State.REFRESHING, R.raw.refreshing_sound);
 mPullRefreshListView.setOnPullEventListener(soundListener);
 }
 
 /**
 *   listview    
 */
 private void initListView() {
 //  getRefreshableView()     listview  
 actualListView = mPullRefreshListView.getRefreshableView();
 
 String []data = new String[] {"android","ios","wp","java","c++","c#"};
 mListItems = new LinkedList<String>();
 // string    string      
 mListItems.addAll(Arrays.asList(data));
 
 mAdapter = new ArrayAdapter<>(getApplicationContext(), 
  android.R.layout.simple_list_item_1, mListItems);
 actualListView.setAdapter(mAdapter);
 }
}
원본 다운로드:http://xiazai.jb51.net/201609/yuanma/AndroidListView(jb51.net).rar
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기