./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
根据源码,其实是默认设计如此,无需修改,如果非要修改,就只能参考上面的修改了