我有一台RecyclerView。每一行都有一个开关按钮,我点击开关来改变它的状态。当我向下滚动并返回时,回收视图会忽略我在switch中所做的更改。所有回收器视图都将重置。
我想在滚动过程中保留回收器视图中的任何更改。
这是我的适配器
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
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);
}
});
}
}
提前谢谢。
发布于 2018-06-10 13:54:44
这是因为在checkedChange侦听器和搜索栏侦听器上,您不会改变灯光对象的状态。因此,当您的视图被回收时,它们将获取旧数据,因此您会有这种奇怪的行为,您应该这样写
light.setLightIsActivated(mSwitch.isChecked())
在您的checkedChange侦听器中。
发布于 2018-06-10 07:42:22
把这个添加到recycleview适配器中,你就可以了。
@Override
public int getItemViewType(int position) {
return position;
}
发布于 2018-06-10 14:02:24
在你列出一个记住更改项的列表之前,任何事情都不会像预期的那样工作。
稍后我可能会发布一个示例。但是可以这样想,你可以有一个数据列表,将点击项存储为yes或no。然后,Recyclerview将从列表中获取项目并记住位置。
https://stackoverflow.com/questions/50779204
复制相似问题