在布局中添加多个可扩展的卡视图

问题描述 投票:0回答:1

我使用的是 AleSpero的库 营造 expandable cardviews 的布局。和预期一样,但现在我想添加多个 cardviews 在同一个片段布局中,动态绑定一些加载的异步列表数据。这怎么可能呢?

按照库上的演示。下面是我如何在布局中添加卡片。

<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/watchlist_holder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="20dp"
    android:orientation="vertical"
    android:clipChildren="false"
    android:background="#FAFAFA">

    <com.alespero.expandablecardview.ExpandableCardView
         android:id="@+id/main_profile_card"
         android:layout_marginLeft="10dp"
         android:layout_marginRight="10dp"
         android:layout_marginTop="10dp"
         android:layout_marginBottom="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:title="My Watchlist"
         app:inner_view="@layout/watchlist_layout"
         app:expandOnClick="true" />
</LinearLayout>

@layout/watchlist_layout 是一个我想重复的布局,它包含一些。textView 和a recyclerView 来显示列表数据。任何帮助或指导都将是巨大的。

android android-layout android-fragments kotlin android-cardview
1个回答
1
投票

你将需要创建不同的 Adapter 和内行XML布局文件,为每个 RecyclerView.

例如:你在一个布局中膨胀了一个。RecyclerView 里面 MainActivity. 你使用的是 Adapter 类,该类基于你的List对行进行充气。在 onBindViewHolder的对象,你应该得到内部的 RecyclerView 存在于父视图的行布局中。一旦你有了这个对象,就创建另一个列表,并为内部的recyclerview初始化另一个适配器。使用新的适配器来填充它内部的数据(类似于第一个recyclerview)。

请记住,这个过程仍然是相同的,每个回收视图

步骤:在布局内创建recylcerview,以显示列表。

  1. 在布局中创建recylcerview,以显示列表。
  2. 创建一个单独的row_layout,根据列表数据的数量在每一行中进行膨胀。
  3. 创建一个Adapter类,它从父类中接收数据,并在recyclerview中膨胀布局(row_ayout)。
  4. 对N个嵌套的RecyclerViews重复这些步骤。

为了便于演示,我在本答案中附上了示例代码,以帮助你理解我的概念。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recylcerViewParent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

item_layout_row.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <com.alespero.expandablecardview.ExpandableCardView
        android:id="@+id/main_profile_card"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        app:expandOnClick="true"
        app:inner_view="@layout/watchlist_inner"
        app:title="My Watchlist" />

</RelativeLayout>

item_recycler_view_favorite.xml。

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


    <TextView
        android:id="@+id/favorites_count"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/margin_small"
        android:layout_marginLeft="@dimen/margin_small"
        android:textSize="12sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/margin_small"
        android:layout_marginEnd="@dimen/margin_small"
        android:orientation="horizontal"
        android:weightSum="2">

        <Button
            android:id="@+id/btn_view_details"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:gravity="start|center_vertical"
            android:padding="5dp"
            android:text="Atish"
            android:textColor="@color/colorPrimaryDark" />

        <Button
            android:id="@+id/btn_add_symbols"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:gravity="end|center_vertical"
            android:padding="5dp"
            android:text="Agrawal"
            android:textColor="@color/colorPrimaryDark" />
    </LinearLayout>


</LinearLayout>

watchlist_inner.xml

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


    <TextView
        android:id="@+id/favorites_count"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/margin_small"
        android:layout_marginLeft="@dimen/margin_small"
        android:textSize="12sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/margin_small"
        android:layout_marginEnd="@dimen/margin_small"
        android:orientation="horizontal"
        android:weightSum="2">

        <Button
            android:id="@+id/btn_view_details"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:gravity="start|center_vertical"
            android:padding="5dp"
            android:text="VIEW DETAILS"
            android:textColor="@color/colorPrimaryDark" />

        <Button
            android:id="@+id/btn_add_symbols"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:gravity="end|center_vertical"
            android:padding="5dp"
            android:text="ADD SYMBOLS"
            android:textColor="@color/colorPrimaryDark" />
    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_favorite"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="@dimen/margin_small"
        android:layout_marginEnd="@dimen/margin_small"
        android:layout_marginBottom="@dimen/margin_small" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {


    List<String> stringsList = new ArrayList<>();

    RecyclerView recyclerViewLayout;
    InnerAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        recyclerViewLayout = findViewById(R.id.recylcerViewParent);


        //Dummy add 10 objects in the list

        for (int i = 0; i < 10; i++) {
            stringsList.add(String.valueOf(i));
        }


        populateRecyclerView();
    }


    /**
     * Create N items in the recycler view
     */
    private void populateRecyclerView() {


        //Initialize Adapter

        recyclerViewLayout.setLayoutManager(new LinearLayoutManager(this));
        recyclerViewLayout.setHasFixedSize(false);

        adapter = new InnerAdapter(recyclerViewLayout, this);
        adapter.setData(this.stringsList);
        recyclerViewLayout.setAdapter(adapter);


    }
}

InnerAdapter.java

public class InnerAdapter extends RecyclerView.Adapter<InnerAdapter.ViewHolder> {
    private List<String> data;
    private RecyclerView recyclerView;
    private int i = 0;
    private Context mContext;

    public InnerAdapter(RecyclerView recyclerView, Context context) {
        this.recyclerView = recyclerView;
        this.mContext = context;

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //Inflater creates rows from a given layout file


        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View v = inflater.inflate(R.layout.item_layout_row, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        //Method to perform actions on individual row based on the position. We will get back to this later


        //Change the title of the CardView
        holder.main_profile_card.setTitle(String.valueOf(position));


        //Creating a dummy adapter again to populate the inner recyclerview
        List<String> innerData = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            innerData.add(String.valueOf(i));
        }

        //Initialize Inner Adapter
        holder.recycler_view_favorite.setLayoutManager(new LinearLayoutManager(mContext));
        holder.recycler_view_favorite.setHasFixedSize(false);
        InnerFavAdapter adapter = new InnerFavAdapter(holder.recycler_view_favorite, mContext);
        adapter.setData(innerData);
        holder.recycler_view_favorite.setAdapter(adapter);

    }

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

    public void setData(List<String> data) {
        this.data = data;
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        RecyclerView recycler_view_favorite;
        ExpandableCardView main_profile_card;

        ViewHolder(View itemView) {
            super(itemView);

            //Get the object of the views from the row layout
            main_profile_card = itemView.findViewById(R.id.main_profile_card);
            recycler_view_favorite = itemView.findViewById(R.id.recycler_view_favorite);
        }
    }
}

InnerFavAdapter.java

public class InnerFavAdapter extends RecyclerView.Adapter<InnerFavAdapter.ViewHolder> {
    private List<String> data;
    private RecyclerView recyclerView;
    private int i = 0;
    private Context mContext;

    public InnerFavAdapter(RecyclerView recyclerView, Context context) {
        this.recyclerView = recyclerView;
        this.mContext = context;

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //Inflater creates rows from a given layout file


        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View v = inflater.inflate(R.layout.inner_recycler_view_favorite, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        //Method to perform actions on individual row based on the position. We will get back to this later


    }

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

    public void setData(List<String> data) {
        this.data = data;
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        ViewHolder(View itemView) {
            super(itemView);


        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.