如何在Fragment类中加载复用独立cardview.xml模板并绑定数据
解决方案
当然可以通过XML模板实现,能大幅优化代码结构、提升可维护性,具体实现步骤如下:
1. 创建CardView的XML模板
新建布局文件res/layout/item_card_view.xml,把你需要的CardView结构(包含展开按钮、Switch、TableView等)定义好:
<?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:layout_margin="8dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <Button android:id="@+id/expand_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="展开"/> <Switch android:id="@+id/option_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开关选项"/> <TableLayout android:id="@+id/content_table" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"/> <!-- 默认隐藏,点击展开按钮切换显示状态 --> </LinearLayout> </androidx.cardview.widget.CardView>
2. 在Fragment布局中添加容器
修改你的Fragment布局(比如res/layout/fragment_main.xml),用LinearLayout作为承载多个CardView的容器:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/card_container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="8dp"/>
3. 在Fragment中加载模板并绑定数据
在Fragment类里,通过LayoutInflater加载模板,循环为每个CardView绑定数据和事件:
public class YourFragment extends Fragment { private LinearLayout cardContainer; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, container, false); cardContainer = view.findViewById(R.id.card_container); // 替换为你的真实数据列表 List<CardData> cardDataList = getCardDataList(); for (CardData data : cardDataList) { // 加载CardView模板 View cardView = inflater.inflate(R.layout.item_card_view, cardContainer, false); // 获取模板内的控件 Button expandBtn = cardView.findViewById(R.id.expand_btn); Switch optionSwitch = cardView.findViewById(R.id.option_switch); TableLayout contentTable = cardView.findViewById(R.id.content_table); // 绑定数据 optionSwitch.setText(data.getSwitchText()); // 这里可根据data配置TableView的内容 // 设置交互事件 expandBtn.setOnClickListener(v -> { int visibility = contentTable.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE; contentTable.setVisibility(visibility); expandBtn.setText(visibility == View.VISIBLE ? "收起" : "展开"); }); optionSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { data.setSwitchChecked(isChecked); }); // 将配置好的CardView添加到容器 cardContainer.addView(cardView); } return view; } // 根据你的业务需求定义数据类 private static class CardData { private String switchText; private boolean isSwitchChecked; public CardData(String switchText, boolean isSwitchChecked) { this.switchText = switchText; this.isSwitchChecked = isSwitchChecked; } public String getSwitchText() { return switchText; } public boolean isSwitchChecked() { return isSwitchChecked; } public void setSwitchChecked(boolean switchChecked) { isSwitchChecked = switchChecked; } } // 模拟获取数据的方法 private List<CardData> getCardDataList() { List<CardData> list = new ArrayList<>(); list.add(new CardData("选项1", false)); list.add(new CardData("选项2", true)); list.add(new CardData("选项3", false)); return list; } }
进阶优化:用RecyclerView处理大量CardView
如果CardView数量较多,推荐用RecyclerView替代LinearLayout,它支持视图复用,性能更优:
3.1 创建RecyclerView适配器
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> { private List<CardData> dataList; public CardAdapter(List<CardData> dataList) { this.dataList = dataList; } @NonNull @Override public CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card_view, parent, false); return new CardViewHolder(view); } @Override public void onBindViewHolder(@NonNull CardViewHolder holder, int position) { CardData data = dataList.get(position); holder.optionSwitch.setText(data.getSwitchText()); holder.optionSwitch.setChecked(data.isSwitchChecked()); // 展开按钮事件 holder.expandBtn.setOnClickListener(v -> { int visibility = holder.contentTable.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE; holder.contentTable.setVisibility(visibility); holder.expandBtn.setText(visibility == View.VISIBLE ? "收起" : "展开"); }); // 开关状态监听 holder.optionSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { data.setSwitchChecked(isChecked); }); } @Override public int getItemCount() { return dataList.size(); } static class CardViewHolder extends RecyclerView.ViewHolder { Button expandBtn; Switch optionSwitch; TableLayout contentTable; public CardViewHolder(@NonNull View itemView) { super(itemView); expandBtn = itemView.findViewById(R.id.expand_btn); optionSwitch = itemView.findViewById(R.id.option_switch); contentTable = itemView.findViewById(R.id.content_table); } } }
3.2 在Fragment中初始化RecyclerView
修改Fragment布局为:
<?xml version="1.0" encoding="utf-8"?> <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp"/>
然后在Fragment的onCreateView中配置:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, container, false); RecyclerView recyclerView = view.findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); List<CardData> cardDataList = getCardDataList(); CardAdapter adapter = new CardAdapter(cardDataList); recyclerView.setAdapter(adapter); return view; }
内容的提问来源于stack exchange,提问作者Wabi-Sabi
相关产品推荐
相关产品推荐

