Android ListView在自定义视图组的ViewPager中不可见
我有一个自定义视图组,它的子视图页导航。这是因为我想向ViewPager添加一个静态标题,并使用onDraw使标题与ViewPager内容垂直滚动。我的ViewPager作为一个孩子有一个ListView。我可以创建ListView和适配器,甚至可以将适配器设置为ListView。当我读取wallList.getAdapter.getItemAt0.toString时,它会返回我希望它返回的数据。但由于某些原因,我根本看不到ListView ViewPager仍能正常工作,其他四个页面暂时具有任意文本。但是应该包含ListView的中心页面显示一个空白屏幕。我不知道到底发生了什么,但这听起来和我以前遇到的问题很相似,我能够通过黑客攻击得到一些可以接受的东西,但无法回答我最初的问题 似乎您只能在某些地方调用setAdapter,我认为它不仅必须在UI线程上,而且在某些方法(自定义或重写)中似乎很难做到这一点。这是我的自定义视图组代码Android ListView在自定义视图组的ViewPager中不可见,android,android-listview,android-custom-view,viewgroup,Android,Android Listview,Android Custom View,Viewgroup,我有一个自定义视图组,它的子视图页导航。这是因为我想向ViewPager添加一个静态标题,并使用onDraw使标题与ViewPager内容垂直滚动。我的ViewPager作为一个孩子有一个ListView。我可以创建ListView和适配器,甚至可以将适配器设置为ListView。当我读取wallList.getAdapter.getItemAt0.toString时,它会返回我希望它返回的数据。但由于某些原因,我根本看不到ListView ViewPager仍能正常工作,其他四个页面暂时具有任
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;
}
}
}我也有这样的经验,我的ViewPager中的一些视图丢失了。当debug知道它在ViewPager中有时只包含2个甚至1个视图时。但实际上,自从我实现了圆形viewpager以来,必须有3个视图 经过多次尝试和错误的方法后,我对DestryItem中的removeView行进行了注释,我感到惊讶,它工作得非常完美 我不确定这能否解决您的问题,因为destroyItem的文档中说 删除给定位置的页面。适配器负责 从其容器中删除视图,尽管它只需确保 这将在它从finishUpdateViewGroup返回时完成 对我来说,我的ViewPager中应该始终有3个视图。因为它是一个圆形的寻呼机
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;
}
}
你可能只需要打个电话
notifyDataSetChanged()
然后将正确显示PagerAdapter和ListView。您是否在customViewGroup上调用了SetWillNotDrawerEnabledFalse 默认情况下,视图组不调用onDraw方法,也尝试实现onDispatchDraw而不是onDraw方法
这个问题不是很明显,我也不确定最初到底是什么原因造成的。我所要做的就是子类FrameLayout,而不是ViewGroup,一切正常。谢谢。我会尝试一下,看看它是否有效,但我怀疑它不会解决问题。我想要5页,我得到了5页,除了一页没有显示任何内容的ListView之外,其他都可以正常工作。谢谢。我敢肯定我试过了,但我会再试一次以确保。你用hierarchyviewer查看过你的ListView在布局中的位置吗?当我和heirarchyviewer一起查看时,我收到了妻子的短信。我使用CM10.1做了一个快速回复,在我关闭了弹出的文本消息窗口后,我可以看到ListView,但只能看到文本消息窗口所在的区域。所以我认为它就在那里,但是它被一些东西掩盖了。hierarchyviewer说ListView需要0.000毫秒来测量和布局,但是需要0.153毫秒来绘制。我想这意味着它不是在测量它,但当我在onMeasure方法中调用measureChild时,我得到了一个NPE。你使用的是什么方法我指的是getItemAt,这是你真正的代码吗?你确定你的封面照片没有覆盖“列表视图”吗?你有没有试过不带封面照片?我不想去看getItemAt。相反,我只是使用wallList对象,因为我不知道它的索引。另外,我刚刚注释掉了setCoverPhoto中的内容,这不是问题所在。