./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
根據源碼,其實是默認設計如此,無需修改,如果非要修改,就只能參考上面的修改了