GridLayout mit dynamischer Ansicht get row / column

Ich bin diesem @ gefolLernprogram, um ein benutzerdefiniertes @ zu erstellView als Element einesGridLayout.

Das ist meinCustomView

public class RowView extends View{

boolean touchOn;
boolean mDownTouch = false;
private OnToggledListener toggledListener;
int _IdRow = 0;
int _IdColumn = 0;

public RowView(Context context, int Rows, int Columns) {
    super(context);
    this._IdRow = Rows;
    this._IdColumn = Columns;
    init();
}

public RowView(Context context) {
    super(context);
    init();
}

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

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

private void init() {
    touchOn = false;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
            MeasureSpec.getSize(heightMeasureSpec));
}

@Override
protected void onDraw(Canvas canvas) {
    if (touchOn) {
        canvas.drawColor(Color.RED);
    } else {
        canvas.drawColor(Color.GRAY);
    }
}
//onClick not possible to use on custom View so, onTouchEvent is the solution
@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);

    switch (event.getAction()) {
        //if Click
        case MotionEvent.ACTION_DOWN:

            touchOn = !touchOn;
            invalidate();

            if(toggledListener != null){
                toggledListener.OnToggled(this, touchOn);
            }

            mDownTouch = true;
            return true;

        case MotionEvent.ACTION_UP:
            if (mDownTouch) {
                mDownTouch = false;
                performClick();
                return true;
            }
    }
    return false;
}

@Override
public boolean performClick() {
    super.performClick();
    return true;
}

public void setOnToggledListener(OnToggledListener listener){
    toggledListener = listener;
}

public int get_IdRow() {
    return _IdRow;
}

public int get_IdColumn() {
    return _IdColumn;
}

In dieser Klasse kann ich erkennen, wenn der Benutzer auf ein Element von @ klickGridLayout und ändere es in eine andere Farbe, das ist ok. Aber das Problem kommt zur Zeit, um dies zu erstellen:

Das ist meinMainActivity wo ich das @ zeiGridLayout :

int numOfCol = mGridLayout.getColumnCount();
    int numOfRow = mGridLayout.getRowCount();
    mRowViews = new RowView[numOfCol*numOfRow];
    for(int yPos=0; yPos<numOfRow; yPos++){
        for(int xPos=0; xPos<numOfCol; xPos++){
            RowView tView = new RowView(this, xPos, yPos);
            tView.setOnToggledListener(this);
            mRowViews[yPos*numOfCol + xPos] = tView;
            mGridLayout.addView(tView);
        }
    }
     mGridLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){

       @Override
       public void onGlobalLayout() {

        final int MARGIN = 5;

        int pWidth = mGridLayout.getWidth();
        int pHeight = mGridLayout.getHeight();
        int numOfCol = mGridLayout.getColumnCount();
        int numOfRow = mGridLayout.getRowCount();
        int w = pWidth/numOfCol;
        int h = pHeight/numOfRow;

        for(int yPos=0; yPos<numOfRow; yPos++){
         for(int xPos=0; xPos<numOfCol; xPos++){
          GridLayout.LayoutParams params =
           (GridLayout.LayoutParams)mRowViews[yPos*numOfCol + xPos].getLayoutParams();
          params.width = w - 2*MARGIN;
          params.height = h - 2*MARGIN;
          params.setMargins(MARGIN, MARGIN, MARGIN, MARGIN);
          mRowViews[yPos*numOfCol + xPos].setLayoutParams(params);
         }
        }
       }});

Auch gibt es eine Methode derInterface OnToggledListener das gibt mir die Zeile und Spalte meinesGridLayout wenn ein Gegenstand angeklickt wird:

@Override
public void OnToggled(MyView v, boolean touchOn) {
//get the id string
 String idString = v.get_IdRow() + ":" + v.get_IdColumn();
}

Ich möchte vermeiden, das zu erstellenmGridLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() weil es auf dem Bildschirm Dinge füllt, die ich nicht will ... Ich habe versucht, @ zu setzGridLayout 6x6 mitandroid:layout_height="400dp" und es zeigt nur 3x3 und das ist dasLogCat Botschaf

D / android.widget.GridLayout: vertikale Einschränkungen: y6-y0> = 1749, y6-y5 <= 291, y5-y4 <= 291, y4-y3 <= 291, y3-y2 <= 291, y2-y1 <= 291, y1-y0 <= 291 sind inkonsistent; dauerhaft entfernen: y6-y5 <= 291.

Ich würde gerne etwas machen wieGridLayout[row][colum], um die Farbe des Hintergrunds zu ermitteln und dann Dinge zu erledigen, aber ich kann diese Lösung nicht finden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage