android 將RecyclerView當成ViewPager用的一系列問題

天下需求怪異,各有千秋,闖蕩android 這條路漫漫長,總有一點戳中你的心;

今天要說的是,將RecyclerView當成ViewPager的一系列問題,且不論爲什麼不選擇ViewPager,總之,作爲客官的你,看到我這篇文章,我且默認爲你有選擇 將 RecyclerView當成ViewPager用的理由,咱先不談這些,只說這其中可能遇到的問題;

RecyclerView橫向滑動:

第一個問題 就是 ViewPager 是每個item 都是一頁 這樣的效果,RecyclerView也要達到這樣的效果

      當然,在看我這篇文章之前,相信你也百度了或者別的方式,也許你有看到很多解決辦法,如果沒有解決你的問題,那麼不妨看看我的解決方式

      在ViewPager adpateritem的佈局上面,item最根部的佈局 不管你是寫成match_parent也好還是 wrap_content也好,最終的你的頁面都不會佔滿整個頁面,不信你可以試一試,解決方式如下

         (1)adpater中onCreateViewHolder裏 

                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_xxx, parent,false);//注意這個parent,false缺一                    不 可,至於爲什麼,有興趣的同學可以看看源碼,這裏不多做說明;

        (2)也許你可以看到別的地方寫到第一步就搞定了,可是事情並不會那麼順利就解決了,不然也許換個手機,你就可以體                   會到失望兩字;

                   在item最根部的佈局下,你再放一個佈局,可以用RelativeLayout這種佈局,讓這個佈局也撐滿全局,寬和高                                 match_parent

         (3)做到這不出以外的話,也許你會發現,其實每個item頁面已經撐滿全局了,但是,另一個問題油然而生,當你需要跳                     到指定下標 item頁面的時候,讓你痛苦的事情出現了,這個item又不是撐滿全局的了,是不是很不爽,沒事,咱再                       來給他整一次容。

                   在adaper裏面 onBindViewHolder

                    RecyclerView.LayoutParams mainVL= (RecyclerView.LayoutParams) holder.main.getLayoutParams();                                         mainVL.height=每個item佔滿整頁的高度(最好動態計算,這個沒什麼難度,百度一大片);
                    holder.main.setLayoutParams(mainVL);

                     holder.main中的holder就不說是什麼了,相信既然能寫到這,holder是什麼,應該很清楚,main就是你每個item最                      根部的佈局id

                   這段代碼主要是用於 約束下標飛躍導致的界面又回到不是整個撐滿全局這種情況,假如你沒有目錄跳轉指定下標                         item的這類似的功能,這段代碼,你可以不加

第二個問題 就是RecyclerView滑到第一頁再往前滑刷新數據 和滑到最後一頁 再往後滑 需要加載更多的解決方法,也就相當於下拉刷新,上拉加載更多是一個道理,兩個處理原理都差不了多少,我就挑一個 滑到最後一頁 再往後滑 需要加載更多的解決方法;

    代碼如下:           

recycler.setOnScrollListener(new RecyclerView.OnScrollListener() {
    //用來標記是否正在向最後一個滑動
    boolean isSlidingToLast = false;
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
        // 當不滾動時
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            //獲取最後一個完全顯示的ItemPosition
            int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
            int totalItemCount = manager.getItemCount();

            // 判斷是否滾動到底部,並且是向右滾動
            if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {
                //加載更多功能的代碼
                getMoreData();//這是我的加載更多需要執行的網絡請求,你可以寫你的
            }

        }

    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        //dx用來判斷橫向滑動方向,dy用來判斷縱向滑動方向
        if (dx > 0) {
            isSlidingToLast = true;
        } else {
            //小於等於0表示停止或向左滾動
            isSlidingToLast = false;
        }
    }

});

第三個問題 就是RecyclerView需要跳轉到指定item,當然這個item是佔滿整頁的,所以可以理解爲跳轉到指定下標頁面

  代碼如下:

/**
 * 滑動到指定位置
 */
protected void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
    // 第一個可見位置
    int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
    // 最後一個可見位置
    int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
    if (position < firstItem) {
        // 第一種可能:跳轉位置在第一個可見位置之前,使用smoothScrollToPosition
        mRecyclerView.smoothScrollToPosition(position);
    } else if (position <= lastItem) {
        // 第二種可能:跳轉位置在第一個可見位置之後,最後一個可見項之前
        int movePosition = position - firstItem;
        if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
            int top = (int)mRecyclerView.getChildAt(movePosition).getX();
            // smoothScrollToPosition 不會有效果,此時調用smoothScrollBy來滑動到指定位置
            mRecyclerView.smoothScrollBy(0, top);
        }
    } else {
        // 第三種可能:跳轉位置在最後可見項之後,則先調用smoothScrollToPosition將要跳轉的位置滾動到可見位置
        // 再通過onScrollStateChanged控制再次調用smoothMoveToPosition,執行上一個判斷中的方法
        mRecyclerView.smoothScrollToPosition(position);
        mToPosition = position;
        mShouldScroll = true;
    }
}

還有就是每個item生命週期的問題,就簡單說下思路吧,有興趣的同學可以去試一試,將生命週期以屬性的方式加載到list裏面的每個實體裏面,每滑一個頁面,在adpter裏面的onBindViewHolder裏面去設置他的屬性,以此來代表item的生命週期,當然,你也可以監聽當前滑到哪一個頁面的了(如第二個問題所述方法),然後用接口回調 adpter中你寫好的方法,設置他的生命週期,這樣,每個item頁面生命週期就可以如你所控制了

今天就先寫到這裏,有時間我會上來貼上整個頁面代碼;


 

   


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章