Search code examples
javaandroidandroid-layoutandroid-linearlayoutandroid-framelayout

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


Solution

  • 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)