BaseQuickAdapter 解决滑动错乱问题

本文介绍了一种解决RecyclerView在滑动过程中出现错乱的方法,通过在实体类中增加检查变量,并利用RadioGroup来更新视图状态,确保了滑动过程中的数据准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 滑动错乱是因为复用了适配器里面的ConverView复用导致的 那如何解决呢

我就直接说如何解决把

1一般适配器是为了展示数据 有数据就说明有实体类  所以我们要在实体类进行操作

 

2在实体类的属性 定义一个变量

  private String name;    //原有的
    private int checkNum;        //我们创建的

然后get set 

实体类全部代码

package com.example.ypc.musictext.code;

public class RadioBase {
    private String name;
    private int checkNum;
    @Override
    public String toString() {
        return "RadioBase{" +
                "name='" + name + '\'' +
                ", checkNum=" + checkNum +
                '}';
    }

    public RadioBase() {
    }

    public RadioBase(String name) {
        this.name = name;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCheckNum() {
        return checkNum;
    }

    public void setCheckNum(int checkNum) {
        this.checkNum = checkNum;
    }

}

3 开始在适配器进行操作 解决滑动错乱

我们就拿radiobutton 进行演示

这是xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_weight="3"
    android:background="#4086"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:textSize="15dp"
        android:text="歌曲名字"
        android:id="@+id/musicname"
        android:layout_height="wrap_content" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_below="@id/musicname"
        android:weightSum="3"
        android:layout_height="wrap_content">
        <RadioGroup
            android:layout_below="@id/musicname"
            android:id="@+id/group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_weight="2"
            android:orientation="horizontal"
            android:weightSum="2">

            <RadioButton
                android:id="@+id/up"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="上一首" />

            <RadioButton
                android:id="@+id/next"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="下一首" />
        </RadioGroup>

        <Button
            android:layout_toRightOf="@id/group"
            android:id="@+id/play"
            android:text="播放"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

</RelativeLayout>

记得用group包裹

5操作

//我这样获取到这个控件  虽然有点麻烦 
RadioGroup group= helper.getView(R.id.group);
        group.setOnCheckedChangeListener(null);    //先把点击事件取消
        group.clearCheck();                //这一步很重要 ,  取消所有的点击效(Radiobutton)
        //根据实体类  自己定义的变量判断选择哪一个    
    switch (item.getCheckNum()){
            case 1:
                group.check(R.id.up);
                break;
            case 2:
                group.check(R.id.next);
                break;
        }
        //根据点击事件给实体类赋值
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                int p=0;
                switch (checkedId){
                    case R.id.up:
                        p=1;
                        break;
                    case R.id.next:
                        p=2;
                        break;
                }
                item.setCheckNum(p);        //给实体类赋值
            }
        });

这样就解决了

适配器所有代码

package com.example.ypc.musictext.adapter;

import android.support.annotation.Nullable;
import android.widget.RadioGroup;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.example.ypc.musictext.R;
import com.example.ypc.musictext.code.RadioBase;

import java.util.List;

public class RecyclerAb extends BaseQuickAdapter<RadioBase,BaseViewHolder> {

    public RecyclerAb(@Nullable List<RadioBase> data) {
        super(R.layout.musicitem,data);
    }

    @Override
    protected void convert(BaseViewHolder helper, final RadioBase item) {
        RadioGroup group= helper.getView(R.id.group);
        group.setOnCheckedChangeListener(null);
        group.clearCheck();
        switch (item.getCheckNum()){
            case 1:
                group.check(R.id.up);
                break;
            case 2:
                group.check(R.id.next);
                break;
        }
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                int p=0;
                switch (checkedId){
                    case R.id.up:
                        p=1;
                        break;
                    case R.id.next:
                        p=2;
                        break;
                }
                item.setCheckNum(p);
            }
        });
        helper.addOnClickListener(R.id.play);
        helper.addOnClickListener(R.id.up);
        helper.addOnClickListener(R.id.next);
        helper.setText(R.id.musicname,item.getName())
               ;

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值