무한 스크롤 적용 ViewPager 적용 예제 - FragmentPagerAdapterSampeActivity :: 소림사의 홍반장!
인터넷에 페이저뷰 예제는 많은데 무한 스크롤 되는 예제는 없더군요..

그래서 갤러리 이미지뷰 무한 스크롤 예제를 보고 응용해서 만들어 봤습니다.

작동은 잘 되는데 아직 초짜 프로그래머랑 확실히 알고 한건 아니라 더 좋은 방법이 있을수도..ㅎ

그래도 최대한 이해하기 쉽게 주석 달아놨으니 일단 주욱 보시고 적용시켜 보세요~


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

//support package에 있는 FragmentActivity를 상속 받는다.
public class FragmentPagerAdapterSampeActivity extends FragmentActivity {
 
 private final static int COUNT=4; // 표시할 페이지 수
 private ViewPager mPager; //뷰 페이저

 private static OnClickListener mButtonClick = new OnClickListener() {  //클릭 이벤트 객체
  public void onClick(View v) {
   String text = ((Button)v).getText().toString();  //버튼에만 이벤트를 등록. 버튼 글자 가져옴.
   Toast.makeText(v.getContext(), text, Toast.LENGTH_SHORT).show(); //토스트로 출력
  }
 };
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.viewpager);
  mPager = (ViewPager)findViewById(R.id.pager);
  mPager.setAdapter(new BkFragmentAdapter(getSupportFragmentManager()));
  
  //무한 스크롤 구현 부분
  mPager.setOnPageChangeListener(new OnPageChangeListener() {
   
   public void onPageSelected(int position) {
    // TODO Auto-generated method stub
    if(position < COUNT) {
     mPager.setCurrentItem(position + COUNT, false);  // 두번째 false 인자값은
                                       //위치이동 에니메이션을 꺼준다
    } else if (position >= COUNT*2) {      // true 로 바꿔서 실행해보면 어떤얘긴지 
                                                              //단박에 알수 있다.
     mPager.setCurrentItem(position - COUNT, false);  
    }
   }
   
   public void onPageScrolled(int position, float positionOffest,
                              int positionOffestPixel) { }
   
   public void onPageScrollStateChanged(int state) { }
  });
 }

 //FragmentPager 구현
 private class BkFragmentAdapter extends FragmentPagerAdapter{
  //생성자
  public BkFragmentAdapter(FragmentManager fm) {super(fm);}

  /**
   * 실제 뷰페이저에서 보여질 fragment를 반환.
   * 일반 아답터(갤러리, 리스트뷰 등)의 getView와 같은 역할
   * @param position - 뷰페이저에서 보여저야할 페이지 값( 0부터 )
   * @return 보여질 fragment
   */
  @Override public Fragment getItem(int position) {
   return ArrayFragment.newInstance(position%COUNT);  
// 3배로 리턴된 페이지를 보여준다. [1 2 3 4] [1 2 3 4] [1 2 3 4] 이렇게 보여지는 원리..
  }

  //뷰페이저에서 보여질 총 페이지 수
  @Override public int getCount() { return COUNT*3; }  
 // 보여줄 페이지의 갯수를 3배로 리턴한다. 
 }

 //뷰 페이저의 페이지에 맞는 fragment를 생성하는 객체
 private static class ArrayFragment extends Fragment {
  int mPosition; //뷰 페이저의 페이지 값

  //fragment 생성하는 static 메소드 뷰페이저의 position을 값을 받는다.
  static ArrayFragment newInstance(int position) {
   ArrayFragment f = new ArrayFragment(); //객체 생성
   Bundle args = new Bundle();     //해당 fragment에서 사용될 정보 담을 번들 객체
   args.putInt("position", position);    //포지션 값을 저장
   f.setArguments(args);       //fragment에 정보 전달.
   return f;           //fragment 반환
  }

  //fragment가 만들어질 때
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   mPosition = getArguments() != null ? getArguments().getInt("position") : 0; 
// 뷰페이저의 position값을  넘겨 받음
  }

  //fragment의 UI 생성
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                      Bundle savedInstanceState) {
   View v = inflater.inflate(R.layout.layout1+mPosition, container, false);
 //미리 알고 있는 레이아웃을 inflate 한다.

   if(mPosition==0){
    v.findViewById(R.id.btn1).setOnClickListener(mButtonClick);
    v.findViewById(R.id.btn2).setOnClickListener(mButtonClick);
   } else if(mPosition==1) {
    v.findViewById(R.id.btn3).setOnClickListener(mButtonClick);
    v.findViewById(R.id.btn4).setOnClickListener(mButtonClick);
   } else{
   }
   return v;
  }
 }
}



http://blog.daum.net/mailss/19 블로그 참조..  

다른 카테고리의 글 목록

Dev. 안드로이드/참고소스 카테고리의 포스트를 톺아봅니다