Android - как добавить представление в LinearLayout с помощью RecylcerView.ViewHolder

У меня есть список предметов. Каждая строка имеет заголовок TextView и LinearLayout, содержащий дочерние представления. Например:

+++++++++++++++++++++++

Название 1

Ребенок_1: цена_1 цена_2 цена_3 цена_4 цена_5

Ребенок_2: цена_1 цена_2 цена_3 цена_4 цена_5

Ребенок_3: цена_1 цена_2 цена_3 цена_4 цена_5

+++++++++++++++++++++++

Название 2

Ребенок_1: цена_1 цена_2 цена_3 цена_4 цена_5

Ребенок_2: цена_1 цена_2 цена_3 цена_4 цена_5

Ребенок_3: цена_1 цена_2 цена_3 цена_4 цена_5

+++++++++++++++++++++++

Проблема, с которой я столкнулся, заключается в том, что LinearLayout показывает не все дочерние представления. Он показывает только child_1 и его цены, но не child_2 и child_3.

+++++++++++++++++++++++

Название 1

Ребенок_1: цена_1 цена_2 цена_3 цена_4 цена_5

+++++++++++++++++++++++

Название 2

Ребенок_1: цена_1 цена_2 цена_3 цена_4 цена_5

+++++++++++++++++++++++

layout_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:id="@+id/child_linear_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" />

    </LinearLayout>
</LinearLayout>

item_child.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:f="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_marginTop="3dp"
        android:layout_marginBottom="3dp">
        <TextView
            android:id="@+id/child_text_view"
            android:layout_width="75dp"
            android:layout_height="wrap_content" />

        <org.apmem.tools.layouts.FlowLayout
            android:id="@+id/flowLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="5dip"
            android:gravity="fill"
            android:orientation="horizontal"
            android:layout_toRightOf="@id/child_text_view"
            f:debugDraw="true"
            f:layoutDirection="ltr"/>
    </RelativeLayout>

</RelativeLayout>

Мой адаптер

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements RecyclerView.OnItemTouchListener {
    private MyViewHolder mMyViewHolder;
    private MyObj mMyObj;

    @Override
    RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i)  { }

    @Override
    public int getItemCount() { }

    @Override
    public int getItemViewType(int position) { }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        protected TextView mTitleTextView;
        protected LinearLayout mLinearLayout;

        public MyViewHolder(View itemView) {
            super(itemView);

            mTitleTextView = (TextView) itemView.findViewById(R.id.title_text_view);
            mLinearLayout = (LinearLayout) itemView.findViewById(R.id.child_linear_layout);
        }
    }

    @Override
    
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
    
        if (viewHolder instanceof MyViewHolder) {
    
            mMyViewHolder = (MyViewHolder) viewHolder;
    
            mMyObj = (MyObj) mItems.get(i);
    
            mMyViewHolder.mTitleTextView.setText(
    mMyObj.getTitle());
            mMyViewHolder.mLinearLayout.removeAllViews();
    
            for (Map.Entry<String, ArrayList<MyObj2>> entry : mMyObj.getNewMap().entrySet()) {
    
                mMyViewHolder.mLinearLayout.addView(makeChildView(entry));
    
            }
    
        } else if () { }
    
    }

    private View makeChildView(Map.Entry<String, ArrayList<MyObj2>> entry) {
        // Inflate child text view and price
    }
}

person chrizonline    schedule 26.07.2015    source источник


Ответы (1)


Мне удалось решить свой вопрос. Ну, мне нужно было добавить android:orientation="vertical" в корень LinearLayout в layout_main.xml. Мне потребовалось некоторое время, потому что тот же макет работает, когда я использовал его без RecyclerView.ViewHolder.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"> // This line fix it

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:id="@+id/child_linear_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical" />

    </LinearLayout>
</LinearLayout>
person chrizonline    schedule 27.07.2015