将多个可扩展卡片视图添加到布局

时间:2020-06-11 05:40:36

标签: android android-layout android-fragments kotlin android-cardview

我正在使用AleSpero's library为我的布局创建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和一个recyclerView以显示列表数据。任何帮助或指导都会很棒。

1 个答案:

答案 0 :(得分:1)

您将需要为每个Adapter创建不同的RecyclerView和“内行XML布局”文件。

例如:在RecyclerView内的MainActivity中给版面充气。您正在使用Adapter类,该类根据您的列表来扩大行。在onBindViewHolder内部,应该获取内部RecyclerView的对象,该对象出现在父视图的行布局中。获得对象后,创建另一个列表并为内部recyclerview初始化另一个适配器。使用新适配器在其中填充数据(类似于第一个recyclerview)。

请记住,每次recyclerview的过程都保持不变

步骤:

  1. 在要显示列表的布局内创建recylcerview
  2. 根据列表数据的数量,在每行中创建一个单独的row_layout进行填充
  3. 创建一个Adapter类,该类从父类接收数据并在recyclerview中放大布局(row_ayout)
  4. 针对N个嵌套的RecyclerView重复这些步骤

对于该演示,我将在示例代码中附带此答案,以帮助您理解我的概念。

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


        }
    }
}