You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

lorentzos Swipecards滑动卡片颜色修改失效问题求助

解决方法:自定义Adapter实现分关卡设置滑动卡片颜色

要实现不同关卡对应不同滑动卡片颜色,核心是在自定义Adapter中根据当前关卡动态设置CardView的样式,具体步骤如下:

1. 准备卡片布局文件

先创建单个滑动卡片的布局(比如命名为item_swipe_card.xml),核心是包含一个CardView,方便后续动态修改颜色:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="8dp"
    card_view:cardElevation="4dp"
    android:layout_margin="16dp">

    <!-- 这里可以添加卡片内的其他内容,比如文本、图片等 -->
    <TextView
        android:id="@+id/card_content"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:gravity="center"
        android:textSize="18sp"/>

</androidx.cardview.widget.CardView>

2. 自定义Adapter类

继承ArrayAdapter(和你之前的用法兼容),添加一个保存当前关卡的变量,并重写getView方法,在方法内根据关卡值设置CardView的颜色:

public class SwipeCardAdapter extends ArrayAdapter<String> {
    private int currentLevel; // 当前关卡(1/2/3)
    private Context mContext;

    public SwipeCardAdapter(Context context, List<String> data, int level) {
        super(context, 0, data);
        this.mContext = context;
        this.currentLevel = level;
    }

    // 提供方法更新关卡并刷新列表
    public void setCurrentLevel(int level) {
        this.currentLevel = level;
        notifyDataSetChanged(); // 通知Adapter刷新所有卡片
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            // 加载卡片布局
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_swipe_card, parent, false);
            holder = new ViewHolder();
            holder.cardView = convertView.findViewById(R.id.card_view);
            holder.contentTv = convertView.findViewById(R.id.card_content);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // 设置卡片内容(根据你的数据调整)
        holder.contentTv.setText(getItem(position));

        // 根据当前关卡设置卡片颜色
        switch (currentLevel) {
            case 1:
                holder.cardView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.level1_color));
                break;
            case 2:
                holder.cardView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.level2_color));
                break;
            case 3:
                holder.cardView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.level3_color));
                break;
            default:
                holder.cardView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.default_color));
        }

        return convertView;
    }

    // ViewHolder优化性能
    static class ViewHolder {
        CardView cardView;
        TextView contentTv;
    }
}

3. 在Activity中使用自定义Adapter

初始化SwipeFlingAdapterView时使用自定义Adapter,关卡切换时调用setCurrentLevel方法更新颜色:

public class SwipeCardActivity extends AppCompatActivity {
    private SwipeFlingAdapterView flingView;
    private SwipeCardAdapter adapter;
    private List<String> cardData; // 卡片数据集合

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

        // 初始化卡片数据
        cardData = new ArrayList<>();
        cardData.add("关卡1卡片1");
        cardData.add("关卡1卡片2");
        // 可以根据关卡动态添加数据,这里示例用固定数据

        // 初始化自定义Adapter,默认关卡1
        adapter = new SwipeCardAdapter(this, cardData, 1);
        flingView = findViewById(R.id.swipe_view);
        flingView.setAdapter(adapter);

        // 示例:关卡切换按钮点击事件
        Button level2Btn = findViewById(R.id.level2_btn);
        level2Btn.setOnClickListener(v -> {
            // 更新关卡为2,刷新卡片颜色
            adapter.setCurrentLevel(2);
            // 如果需要切换卡片数据,也可以在这里更新cardData后调用adapter.notifyDataSetChanged()
        });
    }
}

关键注意点

  • 不要直接设置SwipeFlingAdapterView的背景色,因为它是容器,卡片是Adapter独立生成的子View
  • 每次切换关卡后必须调用notifyDataSetChanged(),让Adapter重新生成所有卡片的样式
  • 使用ViewHolder是为了避免重复查找View,提升滑动性能

内容的提问来源于stack exchange,提问作者Denos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:45:29