anchoredHeaderString字符

./java/com/android/dialer/contactsfragment/res/layout/fragment_contacts.xml---整體
./java/com/android/dialer/contactsfragment/res/layout/add_contact_row.xml ---圖標和創建聯繫人文本
./java/com/android/dialer/contactsfragment/res/layout/contact_row.xml ---圖標和電話號碼
./java/com/android/dialer/contactsfragment/res/layout/header.xml ----A/B/C
./java/com/android/dialer/contactsfragment/FastScroller.java----滑動滾動條

創建聯繫人文本和電話號碼使用同一ID
click_target
一張圖看清現狀:
在這裏插入圖片描述修改的一個問題
前提條件:手機有存SIM與手機聯繫人
操作步驟: 撥號盤–聯繫人–查看該界面
實際結果: 上下導航鍵移動查看,上移發現新建聯繫人 與字母A並排
期望結果: 上下移動導航鍵 新建聯繫人 在字母A的上方
追蹤代碼:

alps/vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/dialer/contactsfragment/ContactsFragment.java		
/*
   * When our recycler view updates, we need to ensure that our row headers and anchored header
   * are in the correct state.
   *
   * The general rule is, when the row headers are shown, our anchored header is hidden. When the
   * recycler view is scrolling through a sublist that has more than one element, we want to show
   * out anchored header, to create the illusion that our row header has been anchored. In all
   * other situations, we want to hide the anchor because that means we are transitioning between
   * two sublists.
   */
  @Override
  public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    fastScroller.updateContainerAndScrollBarPosition(recyclerView);
    int firstVisibleItem = manager.findFirstVisibleItemPosition();
    int firstCompletelyVisible = manager.findFirstCompletelyVisibleItemPosition();
    if (firstCompletelyVisible == RecyclerView.NO_POSITION) {
      // No items are visible, so there are no headers to update.
      return;
    }
    String anchoredHeaderString = adapter.getHeaderString(firstCompletelyVisible);

    // If the user swipes to the top of the list very quickly, there is some strange behavior
    // between this method updating headers and adapter#onBindViewHolder updating headers.
    // To overcome this, we refresh the headers to ensure they are correct.
    if (firstVisibleItem == firstCompletelyVisible && firstVisibleItem == 0) {
      adapter.refreshHeaders();
      anchoredHeader.setVisibility(View.INVISIBLE);
    } else if (firstVisibleItem != 0) { // skip the add contact row
      if (adapter.getHeaderString(firstVisibleItem).equals(anchoredHeaderString)) {
        anchoredHeader.setText(anchoredHeaderString);
        //anchoredHeader.setVisibility(View.VISIBLE);//-----A
        //getContactHolder(firstVisibleItem).getHeaderView().setVisibility(View.INVISIBLE);
        //getContactHolder(firstCompletelyVisible).getHeaderView().setVisibility(View.INVISIBLE);
      } else {
        anchoredHeader.setVisibility(View.INVISIBLE);
        //getContactHolder(firstVisibleItem).getHeaderView().setVisibility(View.VISIBLE);
        //getContactHolder(firstCompletelyVisible).getHeaderView().setVisibility(View.VISIBLE);
      }
    }
  }

findFirstVisibleItemPosition() 返回當前RecycelrView中第一個可見的item的adapter postion
findLastVisibleItemPosition() 返回當前RecycelrView中最後一個可見的item的adapter postion
findFirstCompletelyVisibleItemPosition() 返回當前RecycelrView中第一個完整可見的item的adapter postion
findLastCompletelyVisibleItemPosition() 返回當前RecycelrView中最後一個完整可見的item的adapter postion

根據源碼,其實是默認設計如此,無需修改,如果非要修改,就只能參考上面的修改了

發佈了30 篇原創文章 · 獲贊 14 · 訪問量 4886
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章