2012-02-02 26 views
5

Estoy tratando de hacer aplicaciones y Android con algunas vistas dibujadas dinámicamente. Actualmente, lo único que dibujan las vistas es un círculo en el medio de la vista.¿Por qué no dibujan mis vistas?

Las vistas son dentro de una vista de cuadrícula, pero no parece estar llegando a la derecha.

Esto es lo que sucede cuando la carga de la pantalla:

enter image description here

El bloque de naranja es la vista en la vista de cuadrícula que tiene el foco.

Sin embargo, si uso mi dedo (o ratón) para arrastrar a lo largo de la vista, que se pintó correctamente:

enter image description here

¿Por qué es esto?

Cómo puedo hacer que señale a la segunda imagen todo el tiempo.

Aquí está el código que estoy usando:

public class ChooseTablePanel extends GamePanel { 
    TableAdapter adapter; 

    public ChooseTablePanel(Context context, GamePanel nextPanel, 
      GamePanel failurePanel) { 
     super(context, nextPanel, failurePanel); 
     initialize(); 
    } 

    public ChooseTablePanel(Context context, AttributeSet attrs, 
      GamePanel nextPanel, GamePanel failurePanel) { 
     super(context, attrs, nextPanel, failurePanel); 
     initialize(); 
    } 

    private void initialize() {  
     adapter = new TableAdapter(getContext()); 
     adapter.setTables(new int[] {5,4,3,2,1,6}); 

     GridView gridView = new GridView(getContext()); 
     gridView.setAdapter(adapter); 
     gridView.setNumColumns(adapter.getCount()/3); 

     this.addView(gridView); 
     this.invalidate(); 
    } 


    class TableAdapter extends BaseAdapter { 
     private Context context; 
     private TableView[] tables; 

     public TableAdapter(Context context) { 
      this.context = context; 
     } 

     public void setTables(int[] tables) { 
      this.tables = new TableView[tables.length]; 

      for(int i = 0; i < tables.length; i++){ 
       this.tables[i] = new TableView(tables[i], context); 
      } 
     } 

     public int getCount() { 
      return tables.length; 
     } 

     public Object getItem(int position) { 
      return tables[position]; 
     } 

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

     public View getView(int position, View convertView, ViewGroup parent) { 
      TableView tableView; 
      if (convertView == null) { // if it's not recycled, initialize some attributes 
       tableView = new TableView(1, this.context); 
       tableView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
       tableView.setPadding(8, 8, 8, 8); 
      } else { 
       tableView = (TableView) convertView; 
      } 

      tableView.invalidate(); 
      return tableView; 
     } 
    } 

    class TableView extends View { 
     private int seats; 

     public TableView(int Seats, Context context) { 
      super(context); 
      this.seats = Seats; 

      if(seats < 1){ 
       throw new IllegalArgumentException("Number of seats must be greater than one."); 
      } 
     } 

     public int getSeats() { 
      return seats; 
     } 

     @Override 
     protected void onDraw(Canvas canvas){ 
      int tableWidth = canvas.getWidth()/2; 
      ShapeDrawable tableShape = new ShapeDrawable(new OvalShape());   
      tableShape.setBounds(canvas.getWidth()/2 - tableWidth/2, canvas.getHeight()/2 - tableWidth/2, canvas.getWidth()/2 + tableWidth/2, canvas.getHeight()/2 + tableWidth/2); 

      tableShape.draw(canvas); 
      canvas.drawText(seats + "", 0, 0, new Paint()); 
     } 


    } 

} 
+0

¿Se puede tratar de llamar 'notifyDataSetChanged()' 'en su TableAdapter' después de haber llamado' setTables() '? – Jave

Respuesta

1

En lugar de utilizar canvas.getWidth() y canvas.getHeight() trate de usar y this.getWidth()this.getHeight().

1

supongo que el problema surge porque en la primera llamada de onDraw() el lienzo tiene una anchura y altura cero. Para eliminarla de la tala añadir a este método con el tamaño de salida de la lona:

@Override 
protected void onDraw(Canvas canvas) { 
    int tableWidth = canvas.getWidth()/2; 
    Log.i("onDraw", "w=" + canvas.getWidth() + ", h=" + canvas.getHeight()); 
    ShapeDrawable tableShape = new ShapeDrawable(new OvalShape()); 
    ... 
} 
+0

Además de lo que a.ch. mencionado en la respuesta, también debe anular 'onMeasure()' en su 'TableView', sin el cual el sistema View no tendrá una medida precisa de las dimensiones de su vista. – curioustechizen

+0

Se está haciendo la altura y la anchura correcta: w = 320, h = 480 – Malfist

0

me llaman loco, pero ¿qué ocurre si se llama invalidate() al final de onDraw()? Por ejemplo, vea este fragmento de código de APIDemos:

@Override protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.WHITE); 
     mDrawable.draw(canvas); 
     invalidate(); 
    } 
+0

Adición de una invalidate no tuvo ningún efecto. – Malfist

Cuestiones relacionadas