Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView:在滚动期间不断更改数据_Java_Android_Android Recyclerview_Adapter - Fatal编程技术网

Java RecyclerView:在滚动期间不断更改数据

Java RecyclerView:在滚动期间不断更改数据,java,android,android-recyclerview,adapter,Java,Android,Android Recyclerview,Adapter,我有一个回收站。每行都有一个开关按钮,我点击开关来改变它的状态。 当我向下滚动并返回时,recyclerview会忽略我在开关中所做的更改。 所有recyclerview都将重置 我想在滚动期间保留recyclerview中的任何更改 这是我的适配器 public class LightAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private List<Light> mList

我有一个回收站。每行都有一个开关按钮,我点击开关来改变它的状态。 当我向下滚动并返回时,recyclerview会忽略我在开关中所做的更改。 所有recyclerview都将重置

我想在滚动期间保留recyclerview中的任何更改

这是我的适配器

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


    private List<Light> mList;
    private LightItemClickListener mListener;
    private MainActivity mMainActivity;

    public LightAdapter(List<Light> mList, LightItemClickListener mListener, MainActivity mMainActivity) {
        this.mList = mList;
        this.mListener = mListener;
        this.mMainActivity = mMainActivity;

    }

    @Override
    public LightViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);
        return new LightViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        Light light = mList.get(position);
        ((LightViewHolder)holder).getmSwitch().setChecked(light.isLightIsActivated());
        ((LightViewHolder)holder).getmSeekBar().setProgress(light.getLightingValue());
        if(light.isLightIsActivated())
        {
            ((LightViewHolder)holder).getmSwitchOnTextView().setVisibility(View.VISIBLE);
            ((LightViewHolder)holder).getmSwitchOffTextView().setVisibility(View.GONE);
        } else
        {
            ((LightViewHolder)holder).getmSwitchOnTextView().setVisibility(View.GONE);
            ((LightViewHolder)holder).getmSwitchOffTextView().setVisibility(View.VISIBLE);
        }

        ((LightViewHolder)holder).getmLightNameTextView().setText(light.getLightName());
        ((LightViewHolder)holder).populateItemView(light, mListener,mMainActivity);



    }


    @Override
    public int getItemCount() {
        return mList.size();
    }

    public void add(List<Light> list) {
        mList.clear();
        mList.addAll(list);
        notifyDataSetChanged();
    }
}

提前感谢。

将此添加到recycleview适配器,您应该会没事的

 @Override
public int getItemViewType(int position) {
    return position;
}

这是因为在checkedChange监听器和seekbar监听器上,您没有改变灯光对象的状态。因此,当您的视图被回收时,它们会得到旧数据,因此您会有这种奇怪的行为 你应该写

light.setLightIsActivated(mSwitch.isChecked())

在您的checkedChange侦听器中。

除非您列出一个记住已更改项的列表,否则任何操作都不会按预期进行

稍后我可能会发布一个示例。但这样想一下,你可以有一个数据列表来存储点击项为是或否。然后Recyclerview将从列表中获取项目并记住位置

light.setLightIsActivated(mSwitch.isChecked())