Tech Nerd
Tech Nerd

Reputation: 832

Horizontally Add TextViews to Equally Weighted Linear Layout Dynamically

I am learning Android to my own for this I want to dynamically add textviews to the linear layout with equal weights for expample:

textview1 textview2 (so on)

but if there is only one textview it should fill the parent that is it should be match parent and if there are two items then they should half fill the parent for each item!

so this is my populating method inside the recycler view to dynamically populate the linear layout with text views:

private void populateResourcesItems(ArrayList<ResourcesItem> resources, int position, RecyclerViewHolder recyclerViewHolder) {
        recyclerViewHolder.resourceItemsLayout.removeAllViews();
        for (int its = 0; its < resources.size(); its++) {
            PackagesViewItem packagesViewItem = new PackagesViewItem(context);
            if (hasValue(resources.get(its).getResourceName())) {
                packagesViewItem.getResourcesItem().setText(resources.get(its).getResourceName());
                packagesViewItem.getResourcesItem().setSelected(true);
            }

            //add the view item layout to adapter container
            recyclerViewHolder.resourceItemsLayout.addView(packagesViewItem);
        }//for end
    }//populateResourcesItems ends

and this is my linear layout inside the recycler view layout:

            <LinearLayout
            android:weightSum="1"
            android:background="@color/colorPrimary"
            android:id="@+id/resourceItemsLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/subscribeButton"
            android:layout_below="@+id/resourcesTitle"
            android:layout_marginStart="@dimen/_20sdp"
            android:layout_marginTop="@dimen/_5sdp"
            android:layout_marginEnd="@dimen/_20sdp"
            android:layout_marginBottom="@dimen/_20sdp"
            android:orientation="horizontal" />

here is my class to popuplate the views inside the framelayout:

public class PackagesViewItem extends FrameLayout {

    private LinearLayout resourcesViewItemLayout;
    private TextView resourcesItem;

    @SuppressLint("InflateParams")
    public PackagesViewItem(@NonNull Context context) {
        super(context);
        resourcesViewItemLayout = (LinearLayout) LayoutInflater.from(context).inflate(
                R.layout.layout_packages_view_item, null);

        resourcesItem = (TextView) resourcesViewItemLayout.findViewById(R.id.resourcesItem);
        this.addView(resourcesViewItemLayout);
    }//constructor ends

    public LinearLayout getResourcesViewItemLayout() {
        return resourcesViewItemLayout;
    }

    public void setResourcesViewItemLayout(LinearLayout resourcesViewItemLayout) {
        this.resourcesViewItemLayout = resourcesViewItemLayout;
    }

    public TextView getResourcesItem() {
        return resourcesItem;
    }

    public void setResourcesItem(TextView resourcesItem) {
        this.resourcesItem = resourcesItem;
    }
}//class ends

and the layout for this view item class is:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/resourcesViewItemLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@color/packagesTabTextColorUnselected">

        <TextView
            android:id="@+id/resourcesItem"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/opensans_regular"
            android:gravity="center"
            android:includeFontPadding="false"
            android:text="@string/mobile_bundles_resources"
            android:textColor="@color/colorPrimary"
            android:textSize="@dimen/_12ssp"
            android:visibility="visible" />
    </LinearLayout>

</LinearLayout>

the problem is that it when the item is single textview is not filling the parent see here:

enter image description here

I want to achieve like these boxes:

enter image description here

Upvotes: 3

Views: 431

Answers (2)

Gabriele Mariotti
Gabriele Mariotti

Reputation: 364451

Remove in your LinearLayout android:weightSum="1" and define this LinearLayout.LayoutParams:

    val linearLayout : LinearLayout = findViewById(R.id.layout)
    val lp = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT)
    lp.weight = 1f

Then just apply to the views added in the layout:

    val textView : TextView = TextView(context)
    textView.setText("Text1")
    textView.height = ...
    //...

    val textView2 : TextView = TextView(context)
    textView2.setText("Text2")
    textView2.height = ...
    //....

    linearLayout.addView(textView, lp)
    linearLayout.addView(textView2, lp)

Upvotes: 2

snachmsm
snachmsm

Reputation: 19253

there are plenty of problems in your code, but question is about unneeded margins so...

don't set them

        android:layout_marginStart="@dimen/_20sdp"
        android:layout_marginTop="@dimen/_5sdp"
        android:layout_marginEnd="@dimen/_20sdp"
        android:layout_marginBottom="@dimen/_20sdp"

also remove android:weightSum="1" and set weight for created TextViews just like Gabriele Mariotti suggested

Upvotes: 0

Related Questions