user1553028
user1553028

Reputation: 41

RecyclerView - Layout_weight is ignored when it loads first time

I have an Activity that contains a Fragment. Fragment contains a RecyclerView, displaying CardViews.

CardView is very simple, just a TextView and a CustomView. This is the layout:

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

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:id="@+id/card_current_heat_cardview"
        android:layout_gravity="center_vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:weightSum="4">

            <TextView
                android:id="@+id/card_current_heat_textview"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:textStyle="bold"
                android:textColor="#000000"
                android:background="@android:color/holo_red_dark"
                android:gravity="center_vertical"/>

            <com.amige.vm2.CurrentHeatChartView
                android:id="@+id/card_current_heat_chart_view"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="3"/>

        </LinearLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>

TextView should use 1/4 of the width, and the CustomView 3/4.

Im having trouble understanding why weights are ignored the first time the RecyclerView loads

Image of RecyclerView loaded for the first time

But if I scroll up and down, the layout works as expected for some Cards

Image of RecyclerView scrolled up and down

I also have another Activity (no fragment involved here) that has a RecyclerView and IS using this same CardView Layout and it works perfectly!!

I dont know if it has to do with the Fragment...

What am I missing?

Thanks!

EDIT

This the Adapter code

public class MainAdapter extends RecyclerView.Adapter<MyFragment.MainAdapter.ViewHolder>
    {
        public MainAdapter()
        {

        }

        @Override
        public MyFragment.MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_current_heat, parent, false);

            return new MyFragment.MainAdapter.ViewHolder(v);
        }

        @Override
        public void onBindViewHolder(MyFragment.MainAdapter.ViewHolder holder, int position)
        {
            if (arrayList.size() == 2)
            {
                if (position == 0)
                {
                    holder.variableNameTextView.setText(“Var Name”);

                    holder.currentHeatChartView.reloadChartWithSamples(arrayList.get(0));
                }
                else
                {
                    if ((position - 1) < arrayList.get(1).size())
                    {
                        HashMap variableHashMap = (HashMap) arrayList.get(1).get(position - 1);

                        holder.variableNameTextView.setText(variableHashMap.get("VarName") != null ? (String)variableHashMap.get("VarName") : "");

                        holder.currentHeatChartView.reloadChartWithVariableValuesAndColors(variableHashMap, colorGradientsArrayList.get((position - 1) % colorGradientsArrayList.size()));
                    }
                }
            }
        }

        @Override
        public int getItemCount()
        {
            if (arrayList.size() == 2)
            {
                if (arrayList.get(1).size() > 0)
                {
                    return 1 + arrayList.get(1).size();
                }
                else
                {
                    return 1;
                }
            }
            return 0;
        }

        public class ViewHolder extends RecyclerView.ViewHolder
        {
            TextView variableNameTextView;

            CurrentHeatChartView currentHeatChartView;

            public ViewHolder(View v)
            {
                super(v);

                this.variableNameTextView = (TextView) v.findViewById(R.id.card_current_heat_textview);

                this.currentHeatChartView = (CurrentHeatChartView) v.findViewById(R.id.card_current_heat_chart_view);
            }
        }
    }

Upvotes: 1

Views: 724

Answers (2)

user1553028
user1553028

Reputation: 41

I found the culprit.

There was a ConstraintLayout on top of the hierarchy of the Activity containing the Fragment. Since I was working with nested layouts, ConstraintLayout was not the right way to go.

I changed it to RelativeLayout and the cards are now rendered properly.

Upvotes: 3

Bhuvanesh BS
Bhuvanesh BS

Reputation: 13617

I think your layout inflation is wrong.

View view = View.inflate(mContext, R.layout.your_layout, null);

If you do like that change your code like this.

View view = LayoutInflater.from(mContext).(R.layout.your_layout, parent, false);

Hope it helps:)

Upvotes: 1

Related Questions