Android

RecyclerView解决滑动冲突

2019-04-23  本文已影响42人  12313凯皇

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

上一篇 下一篇

猜你喜欢

热点阅读