2013-04-10 2 views
1

ViewPager이 자식 인 사용자 정의 ViewGroup이 있습니다. 이는 ViewPager에 정적 헤더를 추가하고 onDraw()으로 엉망으로 만들어서 ViewPager 콘텐츠로 헤더를 세로로 스크롤하려고하기 때문입니다. 내 ViewPager의 자녀는 ListView입니다. ListView과 어댑터를 만들고 심지어 어댑터를 ListView으로 설정할 수도 있습니다. wallList.getAdapter().getItemAt(0).toString()을 읽을 때 반환 할 데이터를 반환합니다. 하지만 웬일인지 ListView을 전혀 볼 수 없습니다.사용자 정의 ViewGroup의 ViewPager에서 ListView가 표시되지 않습니다.

여전히 ViewPager은 의도 한대로 작동하며 다른 네 페이지에는 당분간 임의의 텍스트가 있습니다. 그러나 ListView을 포함해야하는 가운데 페이지에는 빈 화면이 표시됩니다. 무슨 일이 일어나는지 알 수는 없지만, 내가 전에 here에 있었던 문제와 비슷하게 들려서, 받아 들일 수있는 뭔가를 얻으려고 내 방식을 해킹 할 수 있었지만, 원래의 질문에 대답 할 수 없었습니다.

특정 장소에서 setAdapter()으로 만 전화를 할 수있는 것처럼 보이지만 UI 스레드에 있어야 할뿐만 아니라 특정 방법 (맞춤 또는 우선 적용)에서 문제가있는 것 같습니다. 내 사용자 정의 ViewGroup 코드는 다음과 같습니다.

public class CustomProfilePager extends ViewGroup{ 

Bitmap coverPhoto, profilePhoto; 
Paint coverStyle, profileStyle; 
String name; 
int coverHeight; 
ViewPager pager; 
ProfilePagerAdapter pagerAdapter; 
ListView wallList; 
Context context; 

public CustomProfilePager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.context = context; 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    Log.i("CustomPager", "calling onLayout()"); 
    pager.layout(0, coverHeight+240, getWidth(), getHeight()); 
//  for(int i=0; i<getChildCount(); i++){ 
//   getChildAt(i).layout(l, t, r, b); 
//  } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    Log.i("CustomPager", "calling onDraw()"); 
    super.onDraw(canvas); 
    if(coverPhoto!=null){ 
     canvas.drawBitmap(coverPhoto, 0, 0, coverStyle); 
    } 
} 

public void init(String name){ 
    Log.i("CustomPager", "calling init()"); 
    this.name = name; 
    coverStyle = new Paint(); 
    coverHeight = (int) (getWidth()/2.7); 
    profileStyle = new Paint(); 
    wallList = new ListView(context); 
    pagerAdapter = new ProfilePagerAdapter(); 
    pager = new ViewPager(context); 
    pager.setAdapter(pagerAdapter); 
    addView(pager); 
    pager.setCurrentItem(2); 
    pager.setOffscreenPageLimit(4); 
} 

public void setCoverPhoto(Bitmap bitmap){ 
    Log.i("CustomPager", "calling setCoverPhoto()"); 
    int initialWidth = bitmap.getWidth(); 
    int initialHeight = bitmap.getHeight(); 
    int finalHeight = (int) (initialWidth/2.7); 
    int initialYoffset = (int) (initialHeight-finalHeight)/2; 
    this.coverPhoto = Bitmap.createBitmap(bitmap, 0, initialYoffset, bitmap.getWidth(), finalHeight); 
    invalidate(); 
} 

public void setProfilePhoto(Bitmap bitmap){ 
    this.profilePhoto = bitmap; 
} 

public ViewPager getViewPager(){ 
    return pager; 
} 

public void setWallAdapter(Profile.WallAdapter adapter){ 
    Log.i("CustomPager", "calling setWallAdapter()"); 
    wallList.setAdapter(adapter); 
} 

public class ProfilePagerAdapter extends PagerAdapter { 
    @Override 
    public void destroyItem(ViewGroup collection, int position, Object view) { 
     ((ViewPager) collection).removeView((View) view); 
    } 
    @Override 
    public Object instantiateItem(ViewGroup collection, int position) { 
     ViewPager parent = (ViewPager) collection; 
     switch (position) { 
     case 2: // Wall 
      wallList.setDividerHeight(0); 
      parent.addView(wallList); 
      return wallList; 
     default: 
      TextView testText = new TextView(context); 
      testText.setText(String.valueOf(position) + ": " + name); 
      testText.setTextSize(46); 
      testText.setGravity(Gravity.CENTER); 
      parent.addView(testText); 
      return testText; 
     } 
    } 
    @Override 
    public int getCount() { 
     return 5; 
    } 
    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 
} 

}

+0

'hierarchyviewer'를 사용하여 레이아웃에서 'ListView'의 위치를 ​​확인 했습니까? – Luksprog

+0

나는 heirarchyviewer와 함께 그것을보고있는 동안 아내로부터 텍스트를 받았습니다. 나는 (CM10.1을 사용하는) 빠른 답장을했고, 나왔던 문자 메시지 창을 닫은 후에 문자 메시지 창이 있던 영역에서만'ListView'를 볼 수있었습니다. 그래서 나는 그것이 거기에 있다고 생각하지만 그것은 무언가에 의해 가려져 있습니다. – Wenger

+0

hierarchyviewer는'ListView'는 측정 및 레이아웃에 0.000ms가 걸리지 만 그릴 때는 .153ms가 소요된다고 말합니다. 나는 그것이 측정하지 않는다는 것을 의미한다고 생각하는데, onMeasure() 메소드에서'measureChild()'를 호출 할 때 NPE를 얻는다. – Wenger

답변

0

의 onDispatchDraw를 implmenting하려고하면 된 onDraw 메소드를 호출하지 말아 난에 원인을 정확히 모르겠어요 첫 번째 장소. 내가해야 할 일은 ViewGroup 대신에 서브 우퍼 FrameLayout뿐이었습니다. 모든 것이 작동합니다.

0

나도 내 ViewPager의보기 중 일부는 소실되었다 경험이 있습니다. 디버그가 ViewPager에서 단지 2 개의 (심지어는 1 조의) 뷰만을 포함한다는 것을 알게되었을 때. 그러나 실제로 순환 뷰 페이지를 구현 한 이후로 3 뷰가 있어야합니다.

많은 시행 착오를 거친 끝에 destoryItem에서 removeView 행에 주석을 달았습니다. 놀랍지 만 완벽하게 작동했습니다. destroyItem 설명서에

가 지정된 위치의 페이지를 제거 말한다 이후는 확실하지 않다

이 문제가 해결됩니다. 어댑터는 컨테이너에서보기를 제거해야하지만 이 finishUpdate (ViewGroup)에서 반환 될 때까지 수행되어야합니다.

내 ViewPager에는 항상 3 개의보기가 있어야합니다. 그것은 원형 ViewPager 였기 때문에.

public class ProfilePagerAdapter extends PagerAdapter { 
    @Override 
    public void destroyItem(ViewGroup collection, int position, Object view) { 

    } 
    @Override 
    public Object instantiateItem(ViewGroup collection, int position) { 
     ViewPager parent = (ViewPager) collection; 
     switch (position) { 
     case 2: // Wall 
      wallList.setDividerHeight(0); 
      parent.addView(wallList); 
      return wallList; 
     default: 
      TextView testText = new TextView(context); 
      testText.setText(String.valueOf(position) + ": " + name); 
      testText.setTextSize(46); 
      testText.setGravity(Gravity.CENTER); 
      parent.addView(testText); 
      return testText; 
     } 
    } 
    @Override 
    public int getCount() { 
     return 5; 
    } 
    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 
} 
+0

. 나는 이것을 시험해보고 작동하는지 봅니다. 그러나 문제가 해결되지 않을 것이라고 생각합니다. 나는 5 페이지를 원한다. 그리고 나는 5 페이지를 얻는다. 아무 것도 보여주지 않는'ListView'가있는 한 페이지를 제외하고 모두 의도 한대로 작동한다. – Wenger

0

당신이 정말로 PagerAdapter에

notifyDataSetChanged() 

를 호출하기 만 할 수 있으며 ListView에이 다음 제대로 표시 될 가능성이 있습니다.

+0

감사합니다. 나는 그것을 시도했다고 확신하지만, 나는 그것을 확실히하기 위해 다른 것을 시도 할 것이다. – Wenger

관련 문제