美文网首页Android
RecyclerView解决滑动冲突

RecyclerView解决滑动冲突

作者: 12313凯皇 | 来源:发表于2019-04-23 21:46 被阅读42次

    今天在学习的时候碰到了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的高度。由于此方法会被多次调用,所以加了一个标记位避免多次设置高度。

    相关文章

      网友评论

        本文标题:RecyclerView解决滑动冲突

        本文链接:https://www.haomeiwen.com/subject/mwxigqtx.html