Android UI之RecyclerView——细节记录

1、简介

该篇文章记录的是关于我们日常开发中常用的RecyclerView的一些小的细节。开发中用的比较多的有BRVAH框架,用于快速构建Adapter,介绍了添加头布局索引值的修改,还有设置空布局。以及滑动监听事件。

不知道大家有没有关注到列表的索引,像Java中的数组和List就是从索引0开始的,像我们时常使用的BRVAH(一款Adapter帮助工具)有必要知道返回的索引值是多少。因为这关乎我们更新的那个条目,或者说修正Data的值。

2、细节探讨

2.1索引值

探究在内部类和外部类中 help.getAdapterPosition( )中的值

 2.1.1 首先看一下没有头布局

            mAdapter = new BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_scroll,mList) {
            @Override
            protected void convert(BaseViewHolder helper, String item) {
                helper.setText(R.id.tv,item);
                Log.e("RecyclerView ID",
                        "convert helper.getAdapterPosition() ="+helper.getAdapterPosition());
                Log.e("RecyclerView ID","convert helper.getLayoutPosition() = "+helper.getLayoutPosition());
            }
        };

        mAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                Log.e("RecyclerView ID","tOnItemClick  position ="+position);
            }
        });
 E/RecyclerView ID: convert helper.getAdapterPosition() =0
 E/RecyclerView ID: convert helper.getLayoutPosition() = 0
 E/RecyclerView ID: convert helper.getAdapterPosition() =1
 E/RecyclerView ID: convert helper.getLayoutPosition() = 1
 E/RecyclerView ID: convert helper.getAdapterPosition() =2
 E/RecyclerView ID: convert helper.getLayoutPosition() = 2
 E/RecyclerView ID: convert helper.getAdapterPosition() =3
 E/RecyclerView ID: convert helper.getLayoutPosition() = 3
 E/RecyclerView ID: convert helper.getAdapterPosition() =4
 E/RecyclerView ID: convert helper.getLayoutPosition() = 4
 E/RecyclerView ID: convert helper.getAdapterPosition() =5
 E/RecyclerView ID: convert helper.getLayoutPosition() = 5
 E/RecyclerView ID: convert helper.getAdapterPosition() =6
 E/RecyclerView ID: convert helper.getLayoutPosition() = 6

 点击 i = 10的条目 OK的
 E/RecyclerView ID: tOnItemClick  position =10

小结论: 该例说明索引与我们预期一致。经测试在外部类也是一致的

2.1.2 为其添加一个头部View

        View view = new View(this);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,50));
        view.setBackgroundColor(getResources().getColor(R.color.colorAccent));
        mAdapter = new MyTestAdapter(R.layout.item_scroll,mList);
        mAdapter.addHeaderView(view);

接着看打印的信息

 E/RecyclerView ID: convert helper.getAdapterPosition() =1
 E/RecyclerView ID: convert helper.getLayoutPosition() = 1
 E/RecyclerView ID: convert helper.getAdapterPosition() =2
 E/RecyclerView ID: convert helper.getLayoutPosition() = 2
 E/RecyclerView ID: convert helper.getAdapterPosition() =3
 E/RecyclerView ID: convert helper.getLayoutPosition() = 3
 E/RecyclerView ID: convert helper.getAdapterPosition() =4
 E/RecyclerView ID: convert helper.getLayoutPosition() = 4
 E/RecyclerView ID: convert helper.getAdapterPosition() =5
 E/RecyclerView ID: convert helper.getLayoutPosition() = 5
 E/RecyclerView ID: convert helper.getAdapterPosition() =6
 E/RecyclerView ID: convert helper.getLayoutPosition() = 6
 E/RecyclerView ID: convert helper.getAdapterPosition() =7
 E/RecyclerView ID: convert helper.getLayoutPosition() = 7

 同样我们再点击list ID为10的条目
 E/RecyclerView ID: tOnItemClick  position =10

那么对于  mAdapter.notifyItemRemoved(position); 这个API呢,比如我们移除一条数据需要刷新的话

当Head为1的时候,当我们点击10的时候,删除的确实9 ,为什么呢,因为其实际条目是从头布局开始的哦。好了懂了吧。

总结: 看清楚了没有。当我们运用BRVAH时,定当注意索引,加入你不添加头布局的话,自然是没什么感觉的,可是当你添加了头布局,那么在其绘制的过程中返回索引的话必然是在其基础上加上头部局的个数的。

2.2 设置空布局

 BRVAH 支持设置空布局,设置空布局注意,这里最好得传入View,直接传入布局ID会报错,这里注意一下吧。

View emptyView = LayoutInflater.from(this).inflate(R.layout.empty_pond_main, null, false);
mPondMainAdapter.setEmptyView(emptyView);

2.3 recyclerView滑动监听

期望实现的滑动效果,当向下滑动的时候对应的控件显示,而向上滑动时进行隐藏。

        // 添加滑动监听事件 ---
        mRvScroll.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            // 判定纵向的滑动距离是否已经大于 控件响应的最小触摸距离
                boolean isSignificantDelta = Math.abs(dy) > ViewConfiguration.getTouchSlop();
                if (isSignificantDelta) {
           // 判定滑动的方向
                    if (dy > 0) {
                        hideLogTab();
                    } else {
                        showLogTab();
                    }
                }
            }
        });

确实达到了滑动隐藏和显示的效果了。这里不完美是,没有引入比较好的动画,这个后面会进行引入的。动画这块也必将下更大的功夫。 

猜你喜欢

转载自blog.csdn.net/crazyZhangxl/article/details/81407133
今日推荐