ListView在自定义ViewGroup中的ViewPager中不可见

时间:2013-04-10 02:01:54

标签: android android-listview android-custom-view viewgroup

我有一个自定义ViewGroup,其中有一个ViewPager。这是因为我想向ViewPager添加静态标头并与onDraw()混乱,以使标题与ViewPager内容垂直滚动。我的ViewPager小时候有ListView。我能够创建ListView和适配器,甚至可以将适配器设置为ListView。当我阅读wallList.getAdapter().getItemAt(0).toString()时,它会返回我希望它返回的数据。但出于某种原因,我根本看不到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;
    }
}

}

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

您可能只需要打电话

notifyDataSetChanged()
然后,PagerAdapter上的

和ListView将正确显示。

答案 2 :(得分:0)

您是否在customViewGroup上调用了setWillNotDrawEnabled(false)?

默认情况下,ViewGroups不会调用onDraw方法,也会尝试使用onDispatchDraw而不是onDraw方法

Android Custom Layout - onDraw() never gets called

答案 3 :(得分:0)

这个问题并不是很明显,我不确定究竟是什么造成了这个问题。我所要做的只是子类FrameLayout而不是ViewGroup,一切正常。