Java GridView行未膨胀

Java GridView行未膨胀,java,android,android-layout,android-arrayadapter,android-gridview,Java,Android,Android Layout,Android Arrayadapter,Android Gridview,我有一个简单的GridView,在我的布局中有自定义适配器。我的代码如下: CircleActivity.java: public class CircleActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV

我有一个简单的
GridView
,在我的布局中有自定义适配器。我的代码如下:

CircleActivity.java:

public class CircleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_circle);

        List<Integer> listColors = new ArrayList<>();
        listColors.add(getResources().getColor(R.color.colorAccent));
        listColors.add(getResources().getColor(R.color.colorPrimary));
        listColors.add(getResources().getColor(R.color.colorPrimaryDark));

        GridView gridView = (GridView) findViewById(R.id.grid_colors);
        CircleAdapter adapter = new CircleAdapter(this,listColors);
        gridView.setAdapter(adapter);
    }
}
<?xml version="1.0" encoding="utf-8"?>

    <GridView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_colors"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
public class CircleAdapter extends BaseAdapter{
private Context context;
private List<Integer> listColor;

public CircleAdapter(Context context, List<Integer> listColor) {
    this.listColor = listColor;
    this.context = context;
}

@Override
public int getCount() {
    return listColor.size();
}

@Override
public Integer getItem(int position) {
    return listColor.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView==null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.row_grid,parent,false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.customCircleView.setFillColor(listColor.get(position));
    holder.customCircleView.setCircleRadius(100);
    return convertView;
}


static class ViewHolder{
    private CustomCircleView customCircleView;
    public ViewHolder(View row){
        customCircleView = (CustomCircleView) row.findViewById(R.id.custom_circle_view);
    }
  }
}
public class CustomCircleView extends View {
private int circleRadius = 20;
private int fillColor = Color.BLACK;


public CustomCircleView(Context context) {
    super(context);
}

public CustomCircleView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public CustomCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomCircleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
    TypedArray typedArray = context.obtainStyledAttributes(R.styleable.CustomCircle);
    circleRadius = typedArray.getInteger(R.styleable.CustomCircle_circle_radius,20);
    fillColor = typedArray.getColor(R.styleable.CustomCircle_fill_color, Color.BLACK);
    typedArray.recycle();
}

public int getCircleRadius() {
    return circleRadius;
}

public void setCircleRadius(int circleRadius) {
    this.circleRadius = circleRadius;
}

public int getFillColor() {
    return fillColor;
}

public void setFillColor(int fillColor) {
    this.fillColor = fillColor;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
    paint.setColor(fillColor);
    paint.setStyle(Paint.Style.FILL);

    canvas.drawCircle(canvas.getWidth()/2,canvas.getHeight()/2,circleRadius,paint);
}
   <declare-styleable name="CustomCircle">
        <attr name="fill_color" format="reference|color"/>
        <attr name="circle_radius" format="integer"/>
    </declare-styleable>
}

attrts.xml:

public class CircleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_circle);

        List<Integer> listColors = new ArrayList<>();
        listColors.add(getResources().getColor(R.color.colorAccent));
        listColors.add(getResources().getColor(R.color.colorPrimary));
        listColors.add(getResources().getColor(R.color.colorPrimaryDark));

        GridView gridView = (GridView) findViewById(R.id.grid_colors);
        CircleAdapter adapter = new CircleAdapter(this,listColors);
        gridView.setAdapter(adapter);
    }
}
<?xml version="1.0" encoding="utf-8"?>

    <GridView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_colors"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
public class CircleAdapter extends BaseAdapter{
private Context context;
private List<Integer> listColor;

public CircleAdapter(Context context, List<Integer> listColor) {
    this.listColor = listColor;
    this.context = context;
}

@Override
public int getCount() {
    return listColor.size();
}

@Override
public Integer getItem(int position) {
    return listColor.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView==null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.row_grid,parent,false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.customCircleView.setFillColor(listColor.get(position));
    holder.customCircleView.setCircleRadius(100);
    return convertView;
}


static class ViewHolder{
    private CustomCircleView customCircleView;
    public ViewHolder(View row){
        customCircleView = (CustomCircleView) row.findViewById(R.id.custom_circle_view);
    }
  }
}
public class CustomCircleView extends View {
private int circleRadius = 20;
private int fillColor = Color.BLACK;


public CustomCircleView(Context context) {
    super(context);
}

public CustomCircleView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public CustomCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomCircleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
    TypedArray typedArray = context.obtainStyledAttributes(R.styleable.CustomCircle);
    circleRadius = typedArray.getInteger(R.styleable.CustomCircle_circle_radius,20);
    fillColor = typedArray.getColor(R.styleable.CustomCircle_fill_color, Color.BLACK);
    typedArray.recycle();
}

public int getCircleRadius() {
    return circleRadius;
}

public void setCircleRadius(int circleRadius) {
    this.circleRadius = circleRadius;
}

public int getFillColor() {
    return fillColor;
}

public void setFillColor(int fillColor) {
    this.fillColor = fillColor;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
    paint.setColor(fillColor);
    paint.setStyle(Paint.Style.FILL);

    canvas.drawCircle(canvas.getWidth()/2,canvas.getHeight()/2,circleRadius,paint);
}
   <declare-styleable name="CustomCircle">
        <attr name="fill_color" format="reference|color"/>
        <attr name="circle_radius" format="integer"/>
    </declare-styleable>

但无法确定为什么它显示为空白。有人能帮我吗?

当您实现自定义视图时,您必须在测量上实现
。这个方法会告诉Android框架你的视图应该有多大。由于您没有为
CustomCircleView
指定此选项,并且在布局中使用了
wrap\u内容
,因此它的大小为零。因此,
GridView
的所有元素都是不可见的,这使得适配器看起来好像不工作。我制作了一个简单的示例实现
onMeasure
,解决了您的问题(只需在
CustomCircleView
中添加此方法即可):

文档建议
size
保持在给定参数范围内(
widthmasurespec
heightMeasureSpec
)。我在这里没有包括这个限制,你可以自己决定在这种情况下你想做什么。
有关这方面的详细信息,请参见关于创建自定义组件的。可以找到有关测量的
的具体信息。

您是否可以尝试将
customCircleView
作为
公共
而不是
私有
?我尝试过,如果出现问题,编译器是否应该提出问题?