1

私には子供の頃からある習慣ViewGroupがありViewPagerます。これは、静的ヘッダーをに追加して、ヘッダーをコンテンツと一緒に垂直方向にスクロールさせたいViewPagerためですonDraw()ViewPagerViewPagerListView子供の頃に を持っています。とアダプタを作成しListView、アダプタを に設定することもできますListView。読むwallList.getAdapter().getItemAt(0).toString()と、返されると予想されるデータが返されます。でもなぜか全然見えないListView

ViewPagerまだ意図したとおりに機能し、残りの 4 ページには当分の間、任意のテキストが含まれています。しかし、含まれているはずの中央のページにはListView空白の画面が表示されます。何が起こっているのかわかりませんが、以前ここにあった問題に似ていて、受け入れられるものを得るために自分の方法をハックすることができましたが、元の質問に答えることができませんでした。

UIスレッド上にある必要があるだけでなく(私が思うに)、特定の場所でしか呼び出すことができないようですがsetAdapter()、カスタムまたはオーバーライドされた特定のメソッド内でそれを行うのに問題があるようです。これが私のカスタム 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

本当に電話する必要があるだけの可能性があります

notifyDataSetChanged()

PagerAdapter と ListView で適切に表示されます。

于 2013-04-12T14:53:16.273 に答える
0

問題はそれほど明白ではなく、そもそも何が原因なのか正確にはわかりません。私がしなければならなかったのは、FrameLayout代わりにサブラスだけでViewGroup、すべてが機能しました。

于 2013-04-16T12:23:19.023 に答える
0

customViewGroup で setWillNotDrawEnabled(false) を呼び出しましたか?

デフォルトでは、ViewGroups は onDraw メソッドを呼び出さないため、onDraw メソッドの代わりに onDispatchDraw を実装してみてください

Android カスタム レイアウト - onDraw() が呼び出されない

于 2013-04-15T22:11:03.650 に答える