android - GridView 无法显示来自 Adapter 的元素

标签 android android-layout android-view android-gridview android-adapter

您好,我正在编写部分代码,我需要在 GridView 上绘制 81 个元素。我基于 BaseAdapter 编写了自己的自定义适配器。我的自定义 View 的对象已创建,但未显示。

这是我的代码: 带有简单网格元素的 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    <pl.zapalka.sudoku.obj.SimpleFieldView 
        android:id="@+id/simpleFieldViewID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

    </pl.zapalka.sudoku.obj.SimpleFieldView>    
</LinearLayout>

自定义 View 类:

public class SimpleFieldView extends View implements OnClickListener{

    private static final String TAG = "SimpleFieldView";

    private static SimpleFieldView _selectedView = null;
    private static Paint _paint = new Paint();

    private Rect _rectToDraw = new Rect(0, 0,100,100);
    private int _digit = 0;
    private boolean _locked = true;

    public SimpleFieldView(Context context) {
        super(context);
        Log.d(TAG, "Creating object");
        this.requestLayout();
        this.invalidate();
        // TODO Auto-generated constructor stub
    }

    public SimpleFieldView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Log.d(TAG, "Creating object from XML");
        this.requestLayout();
        this.invalidate();
        // TODO Auto-generated constructor stub
    }

    public void setDigit(int d){
        this._digit = d;
    }

    public void setLocked(boolean l){
        this._locked = l;
    }

    @Override
    public void onClick(View v) {
        if(v != SimpleFieldView._selectedView){
            SimpleFieldView._selectedView = (SimpleFieldView) v;

        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        Log.d(TAG, "Drawing element");
        super.onDraw(canvas);

        SimpleFieldView._paint.setColor(Color.BLACK);
        SimpleFieldView._paint.setStrokeWidth(4);
        canvas.drawRect(this._rectToDraw, SimpleFieldView._paint);

        if(this == SimpleFieldView._selectedView){

        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        // TODO Auto-generated method stub
        super.onSizeChanged(w, h, oldw, oldh);
        this._rectToDraw.set(0, 0, w, h);
    }
}

自定义适配器:

public class SudokuGridAdapter extends BaseAdapter{

    ArrayList<SimpleFieldInfo> _listOfElements;
    Context _context;

    public SudokuGridAdapter(Context context, ArrayList<SimpleFieldInfo> list){
        this._listOfElements = list;
        this._context = context;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return this._listOfElements.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return this._listOfElements.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SimpleFieldInfo info = this._listOfElements.get(position);

        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(_context);
            convertView = inflater.inflate(R.layout.simple_sudoku_field, null);
        }

        SimpleFieldView view = (SimpleFieldView)convertView.findViewById(R.id.simpleFieldViewID);
        view.setDigit(info.getDigit());
        view.setLocked(info.getLockedStatus());

        view.invalidate();

        return convertView; 
    }
}

部分 Activity 代码:

this.setContentView(R.layout.sudoku_layout);

        GridView v = (GridView) findViewById(R.id.sudokuGrid);
        v.setNumColumns(9);

        ArrayList<SimpleFieldInfo> list = new ArrayList<SimpleFieldInfo>();
        for(int i=0; i<81; i++){
            SimpleFieldInfo view = new SimpleFieldInfo(0, true);
            list.add(view);
        }

        SudokuGridAdapter adapter = new SudokuGridAdapter(this, list);

        v.setAdapter(adapter);

问题是永远不会调用 OnDraw 方法,我不知道为什么 :/

最佳答案

我看到的一个有问题的部分是您如何在 Adapter 中扩充 View 。 我会尝试:

convertView = inflater.inflate(R.layout.simple_sudoku_field, parent, false);

代替:

convertView = inflater.inflate(R.layout.simple_sudoku_field, null);

要检查的另一件事是您的自定义 View 宽度和高度。 你只是 wrap_content 但在你的自定义 View 中 onMeasure 你没有指定你的宽度和高度是多少......也许android将它视为0并且甚至不尝试绘制...... 为了快速测试,将 wrap_content 更改为 20dp 或 smth...

关于android - GridView 无法显示来自 Adapter 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13704545/

相关文章:

android - 将数据从 DialogFragment 发送到 Fragment

android - 为什么所有颜色都一样?

android gridview+baseadapter+scroll 在背景中设置图像的问题?

android - 截取 LinearLayout 和 RecyclerView 的屏幕截图

android - 单击 ImageView 时的语音气泡类型选项 View ?

java - 将预览图像坐标映射到图片图像坐标

android - 是否可以有一个透明的 SYSTEM_ALERT_WINDOW 让 TouchEvents 通过?

java - 如何下载Android Gradle项目外部依赖到文件夹?

Android - 为什么自动链接会忽略 URL 的根路径?

android - 弹出窗口打开时软键盘未打开