将自定义视图与 GridView 一起使用的正确方法是什么



请耐心等待,我对Android开发很陌生。我正在尝试制作一个简单的应用程序,其中包含 9 张排列在 3x3 网格中的卡片。为此,我决定使用 GridView 布局以及每个卡片的自定义视图。我主要基于 GridView 指南。

这是我所拥有的:

主.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/grid_cards"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:numColumns="3"
   android:stretchMode="columnWidth"
   android:gravity="center"
   />

主要活动.java

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        GridView grid_cards = (GridView) findViewById(R.id.grid_cards);
        grid_cards.setAdapter(new CardAdapter(this));
        grid_cards.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                                    int position, long id) {
                Toast.makeText(MainActivity.this, "position = " + position,
                               Toast.LENGTH_SHORT).show();
            }
        });
    }
}

卡适配器.java

public class CardAdapter extends BaseAdapter {
    private Context mContext;
    private int mSize;
    public CardAdapter(Context c) {
        mContext = c;
        mSize = 9;
    }
    public int getCount() {
        return mSize;
    }
    public Object getItem(int position) {
        return null; // XXX
    }
    public long getItemId(int position) {
        return 0; // XXX
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        CardView cardView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            cardView = new CardView(mContext);
            cardView.setBackgroundColor(Color.WHITE);
        } else {
            cardView = (CardView) convertView;
        }
        // force redraw. XXX: truly required?
        cardView.invalidate();
        return cardView;
    }
}

卡片视图.java

public class CardView extends View {
    Paint paint = new Paint();
    public CardView(Context context) {
        super(context);
    }
    @Override
    public void onDraw(Canvas canvas) {
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(1);
        canvas.drawRect(0, 0,
                        canvas.getWidth()-1,
                        canvas.getHeight()-1, paint);
    }
}

相反,我得到的什么都不是。该应用程序不会崩溃,但不会抽出任何卡片。添加一些Log.i()调用似乎表明甚至没有调用CardViewonDraw()。我做错了什么?

谢谢!

你的错误是你从来没有调用过super.onDraw(canvas)

   @Override
    public void onDraw(Canvas canvas) {
       super.onDraw(canvas); //<== this line is needed to begin drawing on the canvas
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(1);
        canvas.drawRect(0, 0,
                        canvas.getWidth()-1,
                        canvas.getHeight()-1, paint);
    }

您需要使用 setMinimumWidth() 和 setMinimumHeight() 显式设置派生的视图维度

相关内容

最新更新