Android ViewPager 무한 순환 효과 구현
일단 효 과 를 볼 게 요.

한 방향 에서 계속 미 끄 러 지 는 느낌 이 들 었 나 요?어떻게 이 루어 졌 나 요?아래 의 생각 을 보다.
사고의 방향 을 실현 하 다.

이 그림 은 무한 순환 을 실현 하 는 사 고 를 표현 합 니 다.즉,데이터 시작 위치 전에 마지막 데 이 터 를 삽입 하고 마지막 데이터 뒤에 첫 번 째 데 이 터 를 삽입 합 니 다.여기까지 미 끄 러 지면 페이지 의 색인 위 치 를 업데이트 하면 ok 입 니 다.
코드 구현
이 방법 은 데이터 처리 에 사 용 됩 니 다.그 중에서 mediaList 는 원본 데이터 이 고 new MediaList 는 처 리 된 데이터 이 며,mMediaList 는 페이지 에 표 시 된 데이터 입 니 다.
public void initItemList(List<MediaIntro> mediaList){
List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
newMediaList.addAll(mediaList);
if(newMediaList.size() > 1){
// 0 , , , 0 , 0
newMediaList.add(0,mediaList.get(mediaList.size() -1));
newMediaList.add(mediaList.get(0));
}
mMediaList = newMediaList;
}
완전한 adapter 코드:
public class AdImagePagerAdapter extends RecyclingPagerAdapter{
private LayoutInflater mInflater;
private List<MediaIntro> mMediaList = new ArrayList<MediaIntro>();
private boolean isInfiniteLoop; //
int size;
public AdImagePagerAdapter (LayoutInflater inflater ,List<MediaIntro> mediaList){
mInflater = inflater;
isInfiniteLoop = false;
initItemList(mediaList);
size = mMediaList.size();
}
public void initItemList(List<MediaIntro> mediaList){
List<MediaIntro> newMediaList = new ArrayList<MediaIntro>();
newMediaList.addAll(mediaList);
if(newMediaList.size() > 1){
// 0 , , , 0 , 0
newMediaList.add(0,mediaList.get(mediaList.size() -1));
newMediaList.add(mediaList.get(0));
}
mMediaList = newMediaList;
}
public MediaIntro getItem(int position){
return mMediaList.get(position);
}
public int getPosition(int position){
return isInfiniteLoop? position%size:position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final ViewHolder holder;
final MediaIntro media = getItem(position);
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.home_ad_item, parent,false);
holder.mImageView = (ImageView)convertView.findViewById(R.id.homeAdItemImg);
holder.mTextView = (TextView)convertView.findViewById(R.id.homeAdItemTxt);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
if(media.source.equals(MagicSource.SOURCE_OUT_AD)){
imageLoader.displayImage(adImageUrl,holder.mImageView,adImageOptions,null,null);
holder.mTextView.setText("");
holder.mImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//
}
});
}else {
imageLoader.displayImage(media.imgUrl, holder.mImageView,adImageOptions,null,null);
holder.mTextView.setText(media.desc+"");
holder.mImageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startMediaDetail(media);
}
});
}
return convertView;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return isInfiniteLoop ? Integer.MAX_VALUE : mMediaList.size();
}
private class ViewHolder{
ImageView mImageView = null;
TextView mTextView = null;
}
public boolean isInfiniteLoop(){
return isInfiniteLoop;
}
public AdImagePagerAdapter setInfiniteLoop(boolean isInfiniteLoop){
this.isInfiniteLoop =isInfiniteLoop;
return this;
}
}
페이지 인덱스 업데이트 코드:
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(adImageAdapter.getCount()>1){
if(position<1){
position=adImageAdapter.getCount()-2;
adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false);
}else if(position > adImageAdapter.getCount()-2){
position = 1;
adViewPager.setCurrentItem(1, false);
}
setAdPagePointSelected(position-1);
}
}
완전한 미끄럼 모니터 코드
public class OnAdPageChangeListener implements OnPageChangeListener{
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(adImageAdapter.getCount()>1){
if(position<1){
position=adImageAdapter.getCount()-2;
adViewPager.setCurrentItem(adImageAdapter.getCount()-2,false);
}else if(position > adImageAdapter.getCount()-2){
position = 1;
adViewPager.setCurrentItem(1, false);
}
setAdPagePointSelected(position-1);
}
}
}
이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android ViewPager로 무한 스크롤 가능조금 조사해 보았더니, 라고 하는 기사가 돈피샤였습니다. 영어 기사라고 하는 것과, 데이터의 갱신에 대해서는 접하고 있지 않다(조금 유스 케이스가 다르다), 라고 하는 것으로 여기에 정리해 보겠습니다. ViewPag...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.