1. 程式人生 > >Android UI之RecyclerView——細節記錄

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();
                    }
                }
            }
        });

確實達到了滑動隱藏和顯示的效果了。這裡不完美是,沒有引入比較好的動畫,這個後面會進行引入的。動畫這塊也必將下更大的功夫。