今天在学习的时候碰到了ScrollerView
嵌套RecyclerView
的情况,但是这种情况会产生滑动冲突,下面记录一下处理冲突的过程。
步骤一
首先通过recyclerView.setNestedScrollingEnabled()
方法禁用RecyclerView
的滑动。
mListRecyclerView.setNestedScrollingEnabled(false);
步骤二
由于步骤一种禁用了RecyclerView
的滑动,导致在显示时RecyclerView
的高度计算会出现问题,这里的解决方案是在Adapter
中计算RecyclerView
的实际高度,并设置其高度,这里实在Adapter
中设置的,也可以在其他地方设置,重点是计算出实际高度。
public class MusicListAdapter extends RecyclerView.Adapter<MusicListAdapter.ViewHolder> {
private Context mContext;
private RecyclerView mRecyclerView;
private View mItemView;
private boolean hasSetRVHeight = false;
public MusicListAdapter(Context context, RecyclerView recyclerView) {
this.mContext = context;
this.mRecyclerView = recyclerView;
}
/**
* 1、获取ItemView的高度
* 2、itemView的数量
* 3、使用ItemViewHeight * ItemViewNum = RecyclerViewHeight
*/
private void setRecyclerViewHeight() {
if (hasSetRVHeight || mRecyclerView == null) {
return;
}
hasSetRVHeight = true;
RecyclerView.LayoutParams ItemViewLP = (RecyclerView.LayoutParams) mItemView.getLayoutParams();
ViewGroup.LayoutParams mRVLP = mRecyclerView.getLayoutParams();
mRVLP.height = ItemViewLP.height * getItemCount();
mRecyclerView.requestLayout();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mItemView = LayoutInflater.from(mContext).inflate(R.layout.item_music_list, parent, false);
return new ViewHolder(mItemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
setRecyclerViewHeight();
}
@Override
public int getItemCount() {
return 6;
}
class ViewHolder extends RecyclerView.ViewHolder {
ViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
重点在setRecyclerViewHeight
方法中,首先在onCreateViewHolder
获取到itemView
,然后获取itemView
的的高度再乘上item
的数量得到RecyclerView
的实际高度,然后在onBindViewHolder
方法中设置RecyclerView
的高度。由于此方法会被多次调用,所以加了一个标记位避免多次设置高度。
网友评论