Android - визуализация дочерних представлений в родительском представлении с ExpandableListView - PullRequest
0 голосов
/ 23 октября 2018

Я хочу отобразить мой ExpandableListView как отдельные CardViews.Поэтому мне нужно накачать мои дочерние представления в родительский макет, а не под ним.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 24 октября 2018

Я придумал решение, которое действует как ExpandableListView, но на самом деле это RecyclerView, заполненный CardViews.При нажатии на заголовок (заголовок группы) появляется событие onClick для отображения / скрытия вложенных элементов

Если кто-то заинтересовался моим решением:

Я создал собственный адаптер, расширяющий RecyclerView.Adapter

public class CustomRecyclerAdapter extends RecyclerView.Adapter<CustomRecyclerAdapter.CustomElementViewHolder> {
private Context context;
private List<CustomElement> elements;

public CustomRecyclerAdapter(Context context, List<CustomElement> elements) {
    this.context = context;
    this.elements = elements;
}

public static class CustomElementViewHolder extends RecyclerView.ViewHolder {
    TextView title;
    LinearLayout container;
    LinearLayout header;

    CustomElementViewHolder(View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.list_group_title);
        container = itemView.findViewById(R.id.element_group);
        header = itemView.findViewById(R.id.group_title_container);
    }
}

@Override
public int getItemCount() {
    return elements.size();
}

@Override
public CustomElementViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_group, viewGroup, false);
    CustomElementViewHolder vh = new CustomElementViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(final CustomElementViewHolder customElementViewHolder, int i) {
    final CustomElement element = elements.get(i);

    customElementViewHolder.title.setText(element.Name);

    customElementViewHolder.header.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(customElementViewHolder.container.getVisibility()==View.GONE)
                customElementViewHolder.container.setVisibility(View.VISIBLE);
            else if(customElementViewHolder.container.getVisibility()==View.VISIBLE)
                customElementViewHolder.container.setVisibility(View.GONE);
        }
    });

    for (SubItem subItem: element.SubList) {
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View actualView = inflater.inflate(R.layout.list_item, null);

        TextView itemHeader = actualView.findViewById(R.id.list_item_label);
        itemHeader.setText(subItem.header);
        TextView itemMessage = actualView.findViewById(R.id.list_item_text);
        itemMessage.setText(subItem.text);

        customElementViewHolder.container.addView(actualView);
    }
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}
}

Каждый подпункт отображается со следующим макетом (list_item.xml)

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<View
    style="@style/DetailCardViewSeparator"/>

<LinearLayout
style="@style/DetailCardValueLlt">

    <TextView
        android:id="@+id/list_item_label"
        style="@style/DetailCardNameValueTvw"/>

    <TextView
        style="@style/DetailCardValueTvw"
        android:id="@+id/list_item_text"
        android:justificationMode="inter_word"/>

</LinearLayout>

и, наконец, группой (list_group.xml)

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

    <android.support.v7.widget.CardView
    style="@style/DetailCardView">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/group_title_container"
            style="@style/DetailCardViewHeadLlt">
            <TextView
                style="@style/DetailCardViewHeadTitle"
                android:id="@+id/list_group_title"/>
        </LinearLayout>

        <LinearLayout
            style="@style/DetailCardViewMainLlt"
            android:id="@+id/element_group"/>       

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