1

我有ViewGroup一个ViewPager小时候的习俗。这是因为我想在其中添加一个静态标题ViewPager并弄乱标题onDraw()以使标题随ViewPager内容垂直滚动。我小时候ViewPager有一个。ListView我能够创建ListView和 适配器,甚至可以将适配器设置为ListView. 当我阅读wallList.getAdapter().getItemAt(0).toString()它时,它会返回我希望它返回的数据。但由于某种原因,我根本看不到ListView

仍然按预期工作,ViewPager其他四页暂时有任意文本。但是应该包含的中心页面ListView显示一个空白屏幕。我不知道发生了什么,但这听起来与我之前在这里遇到的问题相似,并且能够破解我的方式以获得可接受的东西,但无法回答我原来的问题。

似乎您只能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

4 回答 4

0

我也有经验,我的 ViewPager 中的一些视图迷路了。当调试知道它在 ViewPager 中只包含 2 个(有时甚至 1 个)视图时。但实际上必须有 3 个视图,因为我实现了循环 viewpager。

经过多次试验和错误方法后,我评论了 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;
    }
}
于 2013-04-12T09:14:13.987 回答
0

您可能只需要打电话

notifyDataSetChanged()

在 PagerAdapter 上,然后 ListView 将正确显示。

于 2013-04-12T14:53:16.273 回答
0

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

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

Android 自定义布局 - onDraw() 永远不会被调用

于 2013-04-15T22:11:03.650 回答
0

这个问题并不是很明显,我不确定到底是什么原因造成的。我所要做的就是 sublassFrameLayout而不是ViewGroup一切正常。

于 2013-04-16T12:23:19.023 回答