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

viewpager 에러가 발생합니다.

0 추천
앱을 실행하면 그리드뷰로 특정경로에 있는 이미지들을 바둑판 형식으로 띄워줍니다.
사진의 갯수는 가변적이라 언제든지 갯수가 증감할수있습니다. 
[앱내에서 삭제한다거나 추가하진 않습니다.]
현재 메인[그리드뷰] 액티비티와 서브[디테일] 액티비티 두개가 있습니다.
메인에서 바둑판 형식의 사진을 선택하면, intent로 서브액티비티로 전환하면서 
선택한 사진의 path와 포지션값을 가져갑니다. 
서브 액티비티에서 선택한 사진의 path를 이용해서 이미지뷰로 사진을 띄워주는 것까지 했습니다.
 
여기서, 뷰페이저를 이용해서 좌/우로 손으로 슬라이드 했을 때 이전/다음이미지를 보여주려고하는데요,
프로젝트 우클릭->설정/자바빌드패스에서 android-support-v4.jar를 추가해줬습니다.
viewpager를 사용하려면 이게 필요하다고 하더군요.
 
그리고 기존의 sub.xml에 아래와 같이 viewpager를 추가했습니다.(이미지뷰는 그 이전에 있던거)
 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
</android.support.v4.view.ViewPager>
    
<ImageView
    android:id="@+id/image01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
    
</RelativeLayout>

 

그리고 아래는 서브[디테일] 액티비티의 소스입니다.


//onCreate 부분
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(new PagerAdapterClass(getApplicationContext()));

private class PagerAdapterClass extends PagerAdapter
{
        private LayoutInflater li;
	public PagerAdapterClass(Context c)
	{
		super();
		li = LayoutInflater.from(c);
	}
	@Override
	public int getCount() //뷰페이저 총 갯수
	{
	  return paths.length;//이미지 총 갯수
	}
	@Override
	public Object instantiateItem(View container, int position) 
	{
	  View v = null;
	  if(position==0)
	  {
	   Log.d("position is 0","첫번째사진");
	   v = li.inflate(R.layout.gallarydetailactivity, null);
	  }
	  ((ViewPager)container).addView(v, 0); //여기서 에러발생
	  
	 return v;
	}
			
	@Override
	public void destroyItem(View container,int position,Object object)         {
		// TODO Auto-generated method stub
		super.destroyItem(container, position, object);
	}
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
				// TODO Auto-generated method stub
	return false;
	}
			
}

 

이런식으로 예제를 보면서 만들었습니다.

기존의 예제들은 미리 getCount (보여질 뷰페이저갯수)가 정해져있는데, 저같은 경우엔 위에서 말씀드린대로

길이가 가변적이라서.. 현재 특정경로안에 있는 이미지 갯수들을 변수에 넣어서 사용했습니다. 

사진 갯수만큼 값들도 잘 받아왔구요.

문제가 instantiateitem 이부분인거같습니다..

그리드뷰에서 첫번째 사진을 가져온다면 포지션이 0인데, 

뷰페이저로 띄울 때 포지션이 0이면 이미지도 bm = BitmapFactory.decodeFile(paths[position]) ;

이런식으로 각 포지션에 맞는 이미지를 띄워주려고 하는데요... 

((ViewPager)container).addView(v, 0); 에서 아래와같은 에러가 발생합니다.

 

널포인터익셉션인거 보니 제가 빠뜨린부분이 있다거나, 실수한 부분이 있다는게 확실한데....

addview가 listview에서 리스트변수.add(item); 이런 개념이라 하더라구요... 도대체 무엇이 문제인지 모르겠습니다 ㅠ

 

+

지금확인해보니, 위의 소스 상태에서 getcount의 값을 1로 하나만 지정했더니 오류없이 나오긴 하네요..

그대신 뷰페이저 기능은 되지 않습니다..

 

 

anci (19,950 포인트) 님이 2014년 10월 22일 질문

1개의 답변

+2 추천
 
채택된 답변
position 이 0이 아닌 경우에 대한 처리가 없네요.

0이 아닌 경우 v가 null 이라서 오류가 발생합니다.
익명사용자 님이 2014년 10월 22일 답변
anci님이 2014년 10월 22일 채택됨
답변감사합니다.말씀해주신대로 else if문으로 다른 조건문을 걸었더니 오류해결되었습니다.. 혹시 실례가 안된다면 질문 좀 드려도 될까요?
해당 if문에서
if(position==0)
{
  v = li.inflate(R.layout.gallarydetailactivity, null);
}
else if(position==1)
{
  Log.d("else","else...........");
  v = li.inflate(R.layout.gallarydetailactivity, null);
  bm = BitmapFactory.decodeFile(paths[1]); //path값으로 비트맵 생성.
}                   
((ViewPager)container).addView(v, 0);

이런식으로 수정을 했습니다..이런식으로 좌/우로 했을 때 각 포지션값에 맞는 사진을 보여주려고 하는데요, 현재 이 상태에서 좌우로 움직여보니, 사진이 움직이지 않습니다. 슬라이드 할 때마다 양쪽에 슬라이드 반응?이라고 해야하나, 맨 마지막혹은 첫번째 사진이었을 때 더이상 넘어가지 않는것처럼 사이드에 빛처리라고 해야하나; 그런건 나타나는데.. 넘어가지 않네요;ㅎㅎ

현재 gridPostion이라고 그리드뷰에서 선택한 포지션값이 필요할거같아서 intent로 받아온 변수값이 있고, instantiateitem쪽의 position과는 다른 값인거같은데..욘석을 어떤식으로 이용해야 좌/우로 사진을 굴리수있는지 궁금합니다..현재 그리드뷰에서 어떠한 사진을 선택하던간에 position==0, position==1의 조건이 다걸리네요;;;;;
...