마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

viewpager질문입니다..ㅜㅜ

+1 추천
package com.bingsudevil.activity;
 

import com.bingsudevil.Adapter.ViewPagerAdapter;
 
import android.app.Activity;
 import android.os.Bundle;
 import android.support.v4.view.ViewPager;
 import android.support.v4.view.ViewPager.OnPageChangeListener;
 import android.util.Log;
 import android.view.Window;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
public class MainActivity extends Activity{

 private final int COUNT=3;
 private ViewPager mPager;
 private LinearLayout mPageMark;
 private int mPrevPosition;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // TODO Auto-generated method stub
 requestWindowFeature(Window.FEATURE_NO_TITLE); //타이틀바없애기
setContentView(R.layout.activity_main);

 mPageMark = (LinearLayout)findViewById(R.id.page_mark);

 mPager = (ViewPager)findViewById(R.id.manupager);
 mPager.setAdapter(new ViewPagerAdapter(this));

 mPager.setOnPageChangeListener(new OnPageChangeListener() {

 @Override
 public void onPageSelected(int position) {
 // TODO Auto-generated method stub
 mPageMark.getChildAt(mPrevPosition).setBackgroundResource(R.drawable.page_not); //이전 페이지에 해당하는 페이지 표시 이미지 변경
mPageMark.getChildAt(position).setBackgroundResource(R.drawable.page_select); //현재 페이지에 해당하는 페이지 표시 이미지 변경
mPrevPosition = position; //이전 포지션 값을 현재로 변경
}
 @Override
 public void onPageScrolled(int arg0, float arg1, int arg2) {}

 @Override
 public void onPageScrollStateChanged(int arg0) {}
 });
 initPageMark();
 }

 //상단의 현재 페이지 표시하는 뷰 초기화
private void initPageMark(){
 for(int i=0; i<COUNT; i++)
 {
 ImageView iv = new ImageView(getApplicationContext()); //페이지 표시 이미지 뷰 생성
iv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
 
//첫 페이지 표시 이미지 이면 선택된 이미지로
if(i==0)
 iv.setBackgroundResource(R.drawable.page_select);
 else //나머지는 선택안된 이미지로
iv.setBackgroundResource(R.drawable.page_not);
 
//LinearLayout에 추가
mPageMark.addView(iv);
 }
 mPrevPosition = 0; //이전 포지션 값 초기화
}
 }

 

  액티비티구요..

 


package com.bingsudevil.Adapter;

import com.bingsudevil.activity.R;

import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.GridView;

public class ViewPagerAdapter extends PagerAdapter{

private LayoutInflater mInflater;
private Context context;
private int[] bingsu_imgs = new int[]{
R.drawable.coffeebingsu,
R.drawable.berrybingsu,
R.drawable.yogurtbingsu,
R.drawable.fruitbingsu,
R.drawable.greenbingsu,
R.drawable.chocobingsu,
R.drawable.normalbingsu,

R.drawable.coffeebingsu,
R.drawable.berrybingsu,
R.drawable.yogurtbingsu,
R.drawable.fruitbingsu,
R.drawable.greenbingsu,
R.drawable.chocobingsu,
R.drawable.normalbingsu
};

public ViewPagerAdapter( Context con){
super();
mInflater = LayoutInflater.from(con);
context = con;
}


// 뷰페이저에서 사용할 뷰객체 생성/등록
@Override
public Object instantiateItem(View pager, int position) {
// TODO Auto-generated method stub
View v = null;

Log.d("change", String.valueOf(position));

switch (position) {
case 0:
v = mInflater.inflate(R.layout.bingsu_layout, null);
GridView gridViewImages = (GridView)v.findViewById(R.id.bingsugridview);
ImageGridAdapter imageGridAdapter = new ImageGridAdapter(context, bingsu_imgs);
gridViewImages.setAdapter(imageGridAdapter);
break;
case 1:
v = mInflater.inflate(R.layout.devil_layout2, null);
break;
case 2:
v = mInflater.inflate(R.layout.devil_layout3, null);
break;
default:
break;
}
((ViewPager)pager).addView(v, 0);
return v;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 3;
}

//뷰 객체 삭제
@Override
public void destroyItem(View pager, int position, Object view) {
// TODO Auto-generated method stub
((ViewPager)pager).removeAllViews();
}

// instantiateItem메소드에서 생성한 객체를 이용할 것인지
@Override
public boolean isViewFromObject(View view, Object obj) {
// TODO Auto-generated method stub
return view == obj;
}
@Override public void finishUpdate(View arg0) {}
@Override public void restoreState(Parcelable arg0, ClassLoader arg1) {}
@Override public Parcelable saveState() { return null; }
@Override public void startUpdate(View arg0) {}
}

 

pager아답터입니다..

 

페이지를 2개 구성햇을시는 잘되는데.. 2개 이상 넘어가게되면........ 화면이 뜨고 바로 사라집니다;;;;

이거 왜이러는걸까요?ㅠㅠ 도와주세요 고수님..

mamongs (4,050 포인트) 님이 2013년 3월 21일 질문

1개의 답변

0 추천

아답터 클래스의 destroyItem 메소드 부분이 잘못 되었네요.

뷰페이저는 현재 페이지, 이전, 다음 페이지 총 3개의 페이지를 가지고 있고

더 많은 페이지를 가지게 되면 destroyItem 메소드를 통해서 넘치는 페이지를 지울려고 합니다.

 

즉, 쉽게 설명하면 총 3개의 페이지가 있습니다. (0번, 1번, 2번)

0번 페이지를 보여주고 있을 경우 뷰 페이저는

현재 페이지인 0번 뷰, 다음 페이지인 1번 뷰를 가지고 있습니다. 이전 페이지는 없으므로 안가지고 있지요.

 

그리고 다음페이지로 넘기면 1번 페이지가 보여집니다.

이때 뷰페이저는 현재 페이지인 1번, 이전 페이지인 0번, 다음 페이지인 2번 뷰를 가지고 있겠죠.

여기까진 괜찮습니다.

 

하지만 마지막 2번 페이지로 넘기게 되면

뷰 페이저는 현재 페이지인 2번, 이전 페이지인 1번을 가지고 이전의 이전 페이진 0번을 지우려고

destroyItem 메소드를 사용하게 됩니다.

 

하지만 현재 구현 부분은 뷰페이저에 등록된 모든 뷰를 지우도록 되어 있습니다.

((ViewPager)pager).removeAllViews();

 

그래서 2번 페이지만 넘기면 모든 뷰를 사라지게 하는 것입니다.

이부분을

((ViewPager)pager).removeView((View)view); 이렇게 수정해 보세요.

 

추가적으로 말씀드리면 뷰의 양이 적다면 굳이 지울 필요 없이 모두 가지고 있어도 됩니다.

원조안드로이드 (58,190 포인트) 님이 2013년 3월 21일 답변
아..정말감사합니다..ㅠㅠㅠㅠ 덕분에 해결햇네요..
안드로이드를 사이트로 독학하다보니.. ㅠㅠ
자세히 깊숙히 아직 알지못한 제 잘못인것같네요..
감사합니다!!!!
...