请耐心等待,我对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()
调用似乎表明甚至没有调用CardView
的onDraw()
。我做错了什么?
谢谢!
你的错误是你从来没有调用过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() 显式设置派生的视图维度