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;
}
}
}
'hierarchyviewer'를 사용하여 레이아웃에서 'ListView'의 위치를 확인 했습니까? – Luksprog
나는 heirarchyviewer와 함께 그것을보고있는 동안 아내로부터 텍스트를 받았습니다. 나는 (CM10.1을 사용하는) 빠른 답장을했고, 나왔던 문자 메시지 창을 닫은 후에 문자 메시지 창이 있던 영역에서만'ListView'를 볼 수있었습니다. 그래서 나는 그것이 거기에 있다고 생각하지만 그것은 무언가에 의해 가려져 있습니다. – Wenger
hierarchyviewer는'ListView'는 측정 및 레이아웃에 0.000ms가 걸리지 만 그릴 때는 .153ms가 소요된다고 말합니다. 나는 그것이 측정하지 않는다는 것을 의미한다고 생각하는데, onMeasure() 메소드에서'measureChild()'를 호출 할 때 NPE를 얻는다. – Wenger