开发中常用到 竖向 recyclerview中套用横向的recyclerview的情况, 这时候点击 横向recyclerview的cell更新数据时候会出现 横向recyclerview乱动的情况
在list 中记录位置
public static class SelfModel {
private int lastPosition = 0;
private int lastOffset = 0;
}
自定义recyclerview
public class StepSizeView extends RecyclerView {
private List<String> datas = new ArrayList<>();
private StepSizeAdapter adapter;
private Listener.CheckChangeWithPositionListener checkChangeListener;
private LayoutManager layoutManager;
public StepSizeView(@NonNull Context context) {
super(context);
init();
}
public StepSizeView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public StepSizeView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
try {
layoutManager = LayoutManagers.linear(LinearLayoutManager.HORIZONTAL, false).create(this);
setLayoutManager(layoutManager);
adapter = new StepSizeAdapter();
setAdapter(adapter);
addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
View topView = layoutManager.getChildAt(0);
int lastOffset = topView.getLeft();
int lastPosition = layoutManager.getPosition(topView);
if (checkChangeListener != null)
checkChangeListener.onScrollChange(lastPosition,lastOffset);
}
});
} catch (Exception e) {
}
}
public void setDatas(List<StepSize> mdatas, int lastPosition, int lastOffset) {
datas.clear();
if (mdatas != null)
datas.addAll(mdatas);
adapter.notifyDataSetChanged();// 在列表数据加完完成后,执行此方法,对数据进行操作
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
post(() -> {
((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(lastPosition, lastOffset);
});
getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
}
class StepSizeAdapter extends RecyclerView.Adapter {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHoler(LayoutInflater.from(parent.getContext()).inflate(R.layout.view_step_size, null));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ViewHoler vh = (ViewHoler) holder;
vh.setData(position);
}
@Override
public int getItemCount() {
return datas.size();
}
}
class ViewHoler extends RecyclerView.ViewHolder {
public ViewHoler(View root) {
super(root);
}
public void setData(int position) {
xxxx.setOnClickListener(view -> {
if (checkChangeListener != null)
checkChangeListener.onChange(position);
});
}
}
public void setCheckChangeWithPositionListener(Listener.CheckChangeWithPositionListener checkChangeListener) {
this.checkChangeListener = checkChangeListener;
}
}
监听方法
public class Listener {
public interface CheckChangeWithPositionListener {//选项变化监听
void onChange(int position);
void onScrollChange(int lastPosition,int lastOffset);
}
}
然后在竖向recyclerview viewholder中更新数据
class ViewHoler extends RecyclerView.ViewHolder {
private StepSizeView stepSizeView;
public ViewHoler(View root) {
super(root);
stepSizeView = root.findViewById(R.id.stepSizeView);
}
public void setData(int position) {
stepSizeView.setDatas(datas.get(position).stepSizeList, datas.get(position).lastPosition, datas.get(position).lastOffset);
stepSizeView.setCheckChangeWithPositionListener(new Listener.CheckChangeWithPositionListener() {
@Override
public void onChange(int cellPosition) {
//更新数据
}
@Override
public void onScrollChange(int lastPosition, int lastOffset) {
datas.get(position).lastPosition = lastPosition;
datas.get(position).lastOffset = lastOffset;
}
});
}
}