下面是我的项目在ReccyclerView中的XML

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cvItems"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:layout_margin="2dp"
    card_view:cardElevation="0dp"
    card_view:contentPadding="0dp"
    card_view:cardBackgroundColor="#FFFFFF"
    >

    <LinearLayout
        android:orientation="horizontal"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent">
        <TextView
            android:layout_width="0dip"
            android:layout_height="match_parent"
            android:layout_weight="0.8"
            android:id="@+id/tvContent"
            android:textSize="15dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp" />
        <CheckBox
            android:id="@+id/cbSelect"
            android:layout_width="0dip"
            android:layout_weight="0.2"
            android:layout_height="match_parent"
            android:button="@drawable/cb_checked"
            android:gravity="center_horizontal"
            android:textAlignment="center"
            android:layout_gravity="center_horizontal" />
    </LinearLayout>
</android.support.v7.widget.CardView>

这是一个RecyclerView适配器,它为上面的每个项目充气:

public class AdapterTrashIncome extends RecyclerView.Adapter<AdapterTrashIncome.ViewHolder> {

    private ArrayList<ObjectIncome> myItems = new ArrayList<>();

    public AdapterTrashIncome(ArrayList<ObjectIncome> getItems, Context context){
        try {
            mContext = context;
            myItems = getItems;
        }catch (Exception e){
            Log.e(FILE_NAME, "51: " + e.toString());
            e.printStackTrace();
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;
        public CheckBox cbSelect;

        public ViewHolder(View v) {
            super(v);
            tvContent = (TextView) v.findViewById(R.id.tvContent);
            cbSelect = (CheckBox) v.findViewById(R.id.cbSelect);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final ObjectIncome objIncome = myItems.get(position);
        String content = "<b>lalalla</b>";
        holder.tvContent.setText(Html.fromHtml(content));
    }
}

问题是,假设我在ReccyclerView中有10个项目.当我选中项目1、2、3上的复选框,然后向下滚动ReccyclerView时,突然其他一些项目(如项目8、9)被选中.当我再次向上滚动时,选中了项目1和3,但没有选中项目2.知道为什么会这样吗?

推荐答案

这是意料之中的行为.您没有将复选框设置为选中或未选中.您正在 Select 一个,并且视图限制符会使其保持选中状态.您可以将布尔变量添加到ObjectIncome对象中,并保持项目的 Select 状态.

你可以看看我的例子.你可以这样做:

public class AdapterTrashIncome extends RecyclerView.Adapter<AdapterTrashIncome.ViewHolder> {

    private ArrayList<ObjectIncome> myItems = new ArrayList<>();

    public AdapterTrashIncome(ArrayList<ObjectIncome> getItems, Context context){
        try {
            mContext = context;
            myItems = getItems;
            }catch (Exception e){
            Log.e(FILE_NAME, "51: " + e.toString());
            e.printStackTrace();
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;
        public CheckBox cbSelect;

        public ViewHolder(View v) {
            super(v);
            tvContent = (TextView) v.findViewById(R.id.tvContent);
            cbSelect = (CheckBox) v.findViewById(R.id.cbSelect);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final ObjectIncome objIncome = myItems.get(position);
        String content = "<b>lalalla</b>";
        holder.tvContent.setText(Html.fromHtml(content));

        //in some cases, it will prevent unwanted situations
        holder.cbSelect.setOnCheckedChangeListener(null);

        //if true, your checkbox will be selected, else unselected
        holder.cbSelect.setChecked(objIncome.isSelected());

        holder.cbSelect.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    //set your object's last status
                    objIncome.setSelected(isChecked);
            }
        });

    }
}

Android相关问答推荐

listOf(listOf(字符串))在lazyArchitect(lazyStream)中合成

编写视觉转型

对支持哪些数据存储区方法感到困惑

如何修复Google Play市场中有关已删除广告库的错误消息?

从片段导航回来

如何判断堆肥是否为空?

在Jetpack Compose中,我可以配置动画以恒定的速度而不是恒定的时间运行吗?

如何检测低性能 Android 设备进行条件动画渲染?

如何迭代 SqlDelight Select 结果而不将所有内容加载到内存中?

Spinner - onItemLongClick 从未执行

Android Drawable文件夹中的图像显示模糊

块不起作用,出现 "只有安全的 (?.)... " 错误

Jetpack compose :使用 rememberSaveable 时未应用待处理的合成

在 Jetpack Compose 的无状态 Compose 中管理条件逻辑

在 Kotlin 中设置 startActivity() 时类型不匹配

如何使用 Jetpack Compose 制作两个圆圈

LazyColumn 单选中的状态提升. Jetpack compose

如何使用底页,启用和展开父交互

android 13 版本是否会影响 android 12 目标应用程序

Android 应用程序在启动时自动启动