3

嗨,我正在編寫代碼的一部分,我需要在網格視圖上繪製81個元素。我編寫了基於BaseAdapter的自定義適配器。我的自定義視圖的對象已創建,但未顯示。GridView不能顯示適配器中的元素

這裏是我的代碼: 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> 

自定義視圖類:

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; 
    } 
} 

的活動代碼部分:

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的methos是從來沒有電話,我不`噸知道爲什麼:/

回答

0

一個可疑的部分,我看你是怎麼吹的內部適配器的意見。 我會嘗試:代替

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

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

另一件事是檢查你的自定義視圖Width and Height。 你只是wrap_content,但在你的自定義視圖onMeasure你不指定什麼是你的寬度和高度...也許android把它作爲0,甚至不嘗試繪製... 快速測試更改wrap_content to 20dp或smth。 ..