2016-07-20 9 views
1

Ich habe eine GridLayout in der ich dynamisch generiert werden soll TextViews angezeigt werden soll. Zumindest die GridLayout kann 2 Spalten haben und höchstens 3 Spalten haben.Dynamisch erstellte Ansichten erscheinen nicht in der GridLayout richtig

Ich habe eine Funktion namens decide(int), die ein Integer-Argument an eine andere Funktion übergibt, die tatsächlich die TextViews dynamisch generiert. Dieser ganzzahlige Wert wird dann getestet, um die Anzahl der Spalten und Zeilen zu bestimmen, die GridLayout haben kann.

Es folgt mein MainActivity.java

package accordiontry.juspay.accordiontry; 

import android.content.Context; 
import android.graphics.Color; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.GridLayoutManager; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.ViewGroup; 
import android.view.animation.Animation; 
import android.view.animation.LinearInterpolator; 
import android.view.animation.RotateAnimation; 
import android.webkit.WebView; 
import android.widget.ArrayAdapter; 
import android.widget.GridLayout; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    private GridLayout gridLayout; 
    private final int FixedCol3 = 3, FixedCol2 = 2; 





    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     init(); 

     handleClick(); 

     decide(6); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    private void init() 
    { 
     gridLayout = (GridLayout) findViewById(R.id.gridLayout); 
    } 

    public void handleClick() 
    { 

    } 

    private void decide(int num) 
    { 
     if((num%3)==0 || (num%2)==0) 
      generateView(num); 
     else 
     { 
      num = num -1; 
      generateView(num); 
     } 

    } 

    public void generateView(int num) 
    { 
     if(((num%3)==0 && (num%2)==0) || (num%3)==0) 
     { 
      Toast.makeText(MainActivity.this,"3 has been executed", Toast.LENGTH_SHORT).show(); 
      int number = num/3; 
      if(number>1) 
      { 
       gridLayout.setRowCount(number); 
       gridLayout.setColumnCount(FixedCol3); 
       createView(number*FixedCol3); 
      } 
      else 
      { 
       gridLayout.setRowCount(1); 
       gridLayout.setColumnCount(FixedCol3); 
       createView(number*FixedCol3); 
      } 

     } 
     else 
     { 
      Toast.makeText(MainActivity.this,"2 has been executed", Toast.LENGTH_SHORT).show(); 
      int number = num/2; 
      if(number>1) 
      { 
       gridLayout.setRowCount(number); 
       gridLayout.setColumnCount(FixedCol2); 
       createView(number*FixedCol2); 
      } 
      else 
      { 
       gridLayout.setRowCount(1); 
       gridLayout.setColumnCount(FixedCol2); 
       createView(number*FixedCol2); 
      } 
     } 
    } 

    public void createView(int n) 
    { 
     for(int i=0;i<n;i++) 
     { 
      TextView tv = new TextView(this); 
      GridLayout.LayoutParams params = new GridLayout.LayoutParams(); 
      params.height = ViewGroup.LayoutParams.WRAP_CONTENT; 
      params.width = GridLayout.LayoutParams.MATCH_PARENT; 
      tv.setLayoutParams(params); 
      tv.setText("HEY THERE!!!"); 
      gridLayout.addView(tv); 

     } 
    } 


} 

Und folgende ist mein content_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="accordiontry.juspay.accordiontry.MainActivity" 
    tools:showIn="@layout/activity_main"> 


    <GridLayout 
     android:id="@+id/gridLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="129dp"> 


    </GridLayout> 
</RelativeLayout> 

Dies ist die Ausgabe erhalte ich: -

enter image description here

Meine App soll generieren 6 Hey There !!TextViews, aber stattdessen endet es nur Generierung 2.

Wohin gehe ich falsch?

Vielen Dank für Ihre Zeit !!

+0

Welchen Wert erhalten Sie von n in for loop? – Drv

+0

Es hängt davon ab, wo die Methode 'createView' aufgerufen wird. – Auro

+0

Der Wert von 'n' in der 'for'-Schleife hängt von der Zahl ab, die in' onCreate' in 'decide'-Methode übergeben wird. Die Logik ist, dass, wenn die übergebene Zahl eine gerade Zahl ist, das Gitter so viele Zellen haben sollte; Wenn es eine ungerade Zahl ist, sollte das Gitter Zellen haben (Anzahl - 1). Aber zu jeder Zeit sollte die Anzahl der Spalten entweder 2 oder 3 sein. – Auro

Antwort

0

Stellen Sie die Höhe des Gitterlayouts auf wrap_content ein.

<GridLayout 
    android:id="@+id/gridLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="129dp"> 


</GridLayout> 
+0

Es behebt das Problem jedoch nicht. Ich bekomme immer noch den gleichen Bildschirm wie oben – Auro

0

Die Lösung selbst gefunden.

Ändern

params.width = GridLayout.LayoutParams.MATCH_PARENT;

zu

params.width = ViewGroup.LayoutParams.WRAP_CONTENT;

hat den Trick.

Verwandte Themen