Kokodelo
Kokodelo

Reputation: 436

How to dinamically add ImageView/textView at the right of others ImageView/textView in a same layout

So in my code I have 6 arrays (the 5 last could be empty) of objects. Each objects has a name and the array could have many of each object (every array are sorted so every item are grouped).

First, I have this xml file:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fond4"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:background="@color/white"
    android:gravity="center"
    android:text="@string/commentOpti"
    android:textSize="20sp" />

<Button
    android:id="@+id/choisirTroupe"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:onClick="soumission"
    android:text="@string/lancer" />

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        tools:context="${relativePackage}.${activityClass}" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:background="@color/white"
            android:gravity="center"
            android:text="@string/casernes"
            android:textSize="20sp" />

        <!-- Caserne 1 -->

        <LinearLayout
            android:id="@+id/caserne1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:background="@color/white"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_marginLeft="10dp"
                android:background="@drawable/caserne" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:text="@string/deuxPoints"
                android:textSize="25sp" />
        </LinearLayout>

        //Then 5 other like this 1st linearLayou
        //The ids are incremented each time like caserne2 for the 2nd etc...


</ScrollView>

It look like this: https://gyazo.com/17a1276dfff5521d540fb6dc953df424

What I want to do is, for each object in each array (one array: one linear layout), to add a textView with the number of Item and an imageView which represent the object.

Next, you will find how I sort everything, that's not really important I think, but if you want to understand everything you'll have to give a look :p

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_optimisation);

    LinearLayout caserne1 = (LinearLayout) findViewById(R.id.caserne1);
    //...Doing this for the 5 others...

    Intent intent = getIntent();


    //Instanciation of my object
    OptiClashOfClans o = new OptiClashOfClans();

    //In fact, the number of linearLayout i'll have to work with
    o.setNbCasernes(this.nbCaserne);

    if (this.nbBarbares > 0)
        o.ajouterFormation(1, this.nbBarbares);
    //...Adding each object in on array...      
    o.setAFormer(o.triTroupe());

    //And finally here i'll put each object in the good array
    o.orgaCaserne(o);

Now we go for my problem, this portion of code is just next to the one I put previously, here is how I pick up the number of the same object in each array

for (int cptCaserne = 0; cptCaserne < this.nbCaserne; cptCaserne++) {


        // Here I pick up the array of object I'll work with
        Caserne casTmp = o.getCaserneNum(cptCaserne);


        // Here I pick every object which are in the previous array
        ArrayList<Troupe> enFormTmp = new ArrayList<Troupe>();
        enFormTmp = casTmp.getEnFormation();

        // To count where I am in the array of object
        int cptAFormer = 0;         

        //To know if the next object is different from the one I'm working with
        Troupe troupTmp = enFormTmp.get(cptAFormer);

        int cptTroupTmp = 0;

        //For the object t in the array of object
        for (Troupe t : enFormTmp) {
            cptTroupTmp = 0;

            //While the object is the same from the one we're working with
            while (!troupTmp.equals(t)) {
                //Incrementing the previous counter
                cptTroupTmp++;
                cptAFormer++;
            }

And finally here is how I don't really know how to do:

            ImageView iView = new ImageView(Optimisation.this);

            //To know which background i'll add to the image view
            //I'll do this for each different object
            if (t.getNom().equals("Barbare"))
                iView.setImageResource(R.drawable.barbare);
            //...

            //The text view with the number of object I found
            TextView tView = new TextView(Optimisation.this);
            tView.setText("" + cptTroupTmp);


            //And now it's here where I want to add the different views
            switch (cptCaserne) {
            case 0:
                caserne1.addView(tView);
                caserne1.addView(iView);
            case 1:
                caserne2.addView(tView);
                caserne1.addView(iView);
            case 2:
                caserne3.addView(tView);
                caserne1.addView(iView);
            case 3:
                caserne4.addView(tView);
                caserne1.addView(iView);

            }
            troupTmp = enFormTmp.get(cptAFormer);
        }

    }

With this code I have an insane black screen when I'm going on this activity. Here is what I want to do with in red the textView with the number of objet and in green the imageView of the object... https://gyazo.com/31b16982ce30b66391bafdd2cd4d86fc

I've found some stuff to do with LayoutInflater but I haven't been successfull with these... Thanks a lot if you could help me.

PS: sorry for the mistakes, I think there are a lot, but in long post like this one, my school english isn't very effective ^^ Thanks again :)

Upvotes: 0

Views: 53

Answers (1)

Luke Villanueva
Luke Villanueva

Reputation: 2070

Correct me if I'm wrong. But from what I understood you just need to accomplish what is being shown here https://gyazo.com/31b16982ce30b66391bafdd2cd4d86fc?

Base on your code you just have to add an additional LinearLayout having an horizontal orientation on each LinearLayout before adding the TextView and Image View.

Here's an example using your code:

LinearLayout innerLayout = new LinearLayout(Optimisation.this)
innerLayout.setOrientation(LinearLayout.HORIZONTAL);
ImageView iView = new ImageView(Optimisation.this);

        //To know which background i'll add to the image view
        //I'll do this for each different object
        if (t.getNom().equals("Barbare"))
            iView.setImageResource(R.drawable.barbare);
        //...

        //The text view with the number of object I found
        TextView tView = new TextView(Optimisation.this);
        tView.setText("" + cptTroupTmp);


        innerLayout.addView(tView);
        innerLayout.addView(iView);

        //And now it's here where I want to add the different views
        switch (cptCaserne) {
        case 0:
            caserne1.addView(innerLayout);
        case 1:
            caserne2.addView(innerLayout);
        case 2:
            caserne3.addView(innerLayout);
        case 3:
            caserne4.addView(innerLayout);

        }

Feel free to adjust it if the Layout that I'm adding the innerLayout in is wrong. But basically, that's the idea.

Upvotes: 1

Related Questions