首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RecyclerView:滚动过程中不断更改数据

RecyclerView:滚动过程中不断更改数据
EN

Stack Overflow用户
提问于 2018-06-10 06:55:07
回答 3查看 799关注 0票数 1

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

我想在滚动过程中保留回收器视图中的任何更改。

这是我的适配器

代码语言:javascript
复制
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();
    }
}

还有我的ViewHolder

代码语言:javascript
复制
public class LightViewHolder extends RecyclerView.ViewHolder {

    private Context mContext;

    private SeekBar mSeekBar;

    private Switch mSwitch;
    private TextView mSwitchOffTextView;
    private TextView mSwitchOnTextView;

    private TextView mLightNameTextView;

    public LightViewHolder(View itemView) {
        super(itemView);
        mSeekBar = itemView.findViewById(R.id.seekBar1);
        mSwitch = itemView.findViewById(R.id.switch1);
        mSwitchOffTextView = itemView.findViewById(R.id.switch_off_textview);
        mSwitchOnTextView = itemView.findViewById(R.id.switch_on_textview);
        mLightNameTextView = itemView.findViewById(R.id.light_name_text_view);

    }

    public void populateItemView(final Light lightData, final LightItemClickListener onLightClickListener, MainActivity mMainActivity) {
        mContext =mMainActivity.getApplicationContext();

        switchClick(lightData,onLightClickListener);
        seekBarChangeValue(lightData,onLightClickListener);
    }
    public SeekBar getmSeekBar() {
        return mSeekBar;
    }
    public TextView getmSwitchOnTextView() {
        return mSwitchOnTextView;
    }

    public TextView getmSwitchOffTextView() {
        return mSwitchOffTextView;
    }

    public TextView getmLightNameTextView() {
        return mLightNameTextView;
    }
    public Switch getmSwitch() {
        return mSwitch;
    }

    public void switchClick(final Light light, final LightItemClickListener onLightClickListener) {
        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(mSwitch.isChecked())
                {

                    mSwitchOffTextView.setVisibility(View.GONE);
                    mSwitchOnTextView.setVisibility(View.VISIBLE);


                } else {
                    mSwitchOnTextView.setVisibility(View.GONE);
                    mSwitchOffTextView.setVisibility(View.VISIBLE);

                }

                onLightClickListener.onSwitchClickListener(light);
            }
        });

    }

    private void seekBarChangeValue(final Light light, final LightItemClickListener onLightClickListener) {


        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                Log.d("test","changed");
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                Log.d("test","start");
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {


                onLightClickListener.onSeekBarStopListener(light);
            }
        });

    }
}

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-10 13:54:44

这是因为在checkedChange侦听器和搜索栏侦听器上,您不会改变灯光对象的状态。因此,当您的视图被回收时,它们将获取旧数据,因此您会有这种奇怪的行为,您应该这样写

代码语言:javascript
复制
light.setLightIsActivated(mSwitch.isChecked())

在您的checkedChange侦听器中。

票数 0
EN

Stack Overflow用户

发布于 2018-06-10 07:42:22

把这个添加到recycleview适配器中,你就可以了。

代码语言:javascript
复制
 @Override
public int getItemViewType(int position) {
    return position;
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-10 14:02:24

在你列出一个记住更改项的列表之前,任何事情都不会像预期的那样工作。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档