- CompoundButton 源码分析
- LinearLayout 源码分析
- SearchView 源码解析
- LruCache 源码解析
- ViewDragHelper 源码解析
- BottomSheets 源码解析
- Media Player 源码分析
- NavigationView 源码解析
- Service 源码解析
- Binder 源码分析
- Android 应用 Preference 相关及源码浅析 SharePreferences 篇
- ScrollView 源码解析
- Handler 源码解析
- NestedScrollView 源码解析
- SQLiteOpenHelper/SQLiteDatabase/Cursor 源码解析
- Bundle 源码解析
- LocalBroadcastManager 源码解析
- Toast 源码解析
- TextInputLayout
- LayoutInflater 和 LayoutInflaterCompat 源码解析
- TextView 源码解析
- NestedScrolling 事件机制源码解析
- ViewGroup 源码解析
- StaticLayout 源码分析
- AtomicFile 源码解析
- AtomicFile 源码解析
- Spannable 源码分析
- Notification 之 Android 5.0 实现原理
- CoordinatorLayout 源码分析
- Scroller 源码解析
- SwipeRefreshLayout 源码分析
- FloatingActionButton 源码解析
- AsyncTask 源码分析
- TabLayout 源码解析
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
2.3 NavigationMenuAdapter
因为我们涉及到多个 item type,所以重点看三个方法,分别为: getItemViewType , onCreateViewHolder , onBindViewHolder 。
- getItemViewType
#NavigationMenuPresenter.NavigationMenuAdapter
@Override
public int getItemViewType(int position) {
NavigationMenuItem item = mItems.get(position);
if (item instanceof NavigationMenuSeparatorItem) {
return VIEW_TYPE_SEPARATOR;
} else if (item instanceof NavigationMenuHeaderItem) {
return VIEW_TYPE_HEADER;
} else if (item instanceof NavigationMenuTextItem) {
NavigationMenuTextItem textItem = (NavigationMenuTextItem) item;
if (textItem.getMenuItem().hasSubMenu()) {
return VIEW_TYPE_SUBHEADER;
} else {
return VIEW_TYPE_NORMAL;
}
}
throw new RuntimeException("Unknown item type.");
}根据 item 的类型去决定 ItemViewType,那么我们上面已经进行了详细的分析,一种有 3 种 item 类型,其中 NavigationMenuTextItem 分为 hasSubMenu() 为 true,false 两种情况。刚好对应上述代码。
- onCreateViewHolder
#NavigationMenuPresenter.NavigationMenuAdapter
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_NORMAL:
return new NormalViewHolder(mLayoutInflater, parent, mOnClickListener);
case VIEW_TYPE_SUBHEADER:
return new SubheaderViewHolder(mLayoutInflater, parent);
case VIEW_TYPE_SEPARATOR:
return new SeparatorViewHolder(mLayoutInflater, parent);
case VIEW_TYPE_HEADER:
return new HeaderViewHolder(mHeaderLayout);
}
return null;
}根据不同的 itemViewType,返回不同的 ViewHolder,每个 viewholder 也对应一个布局文件,分别为:
- SubheaderViewHolder 对应的布局文件为一个 TextView
- SeparatorViewHolder 对应一个 FrameLayout,其内部是
height=1dp的 View - HeaderViewHolder 对应 mHeaderLayout,其实就是 LinearLayout 包裹我们设置的 headerLayout
- NormalViewHolder 这个对应于一个
NavigationMenuItemView
那么大概知道每个 itemViewType 对应的布局文件之后,就可以看 onBindViewHolder 了
- onBindViewHolder
@Override
#NavigationMenuPresenter.NavigationMenuAdapter
public void onBindViewHolder(ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case VIEW_TYPE_NORMAL: {
NavigationMenuItemView itemView = (NavigationMenuItemView) holder.itemView;
itemView.setIconTintList(mIconTintList);
if (mTextAppearanceSet) {
itemView.setTextAppearance(itemView.getContext(), mTextAppearance);
}
if (mTextColor != null) {
itemView.setTextColor(mTextColor);
}
itemView.setBackgroundDrawable(mItemBackground != null ?
mItemBackground.getConstantState().newDrawable() : null);
NavigationMenuTextItem item = (NavigationMenuTextItem) mItems.get(position);
itemView.initialize(item.getMenuItem(), 0);
break;
}
case VIEW_TYPE_SUBHEADER: {
TextView subHeader = (TextView) holder.itemView;
NavigationMenuTextItem item = (NavigationMenuTextItem) mItems.get(position);
subHeader.setText(item.getMenuItem().getTitle());
break;
}
case VIEW_TYPE_SEPARATOR: {
NavigationMenuSeparatorItem item =
(NavigationMenuSeparatorItem) mItems.get(position);
holder.itemView.setPadding(0, item.getPaddingTop(), 0,
item.getPaddingBottom());
break;
}
case VIEW_TYPE_HEADER: {
break;
}
}
}恩,这里主要就是为 4 中 itemTypeView 所对应的 item 进行控件的赋值了,从简单到难来看:
VIEW_TYPE_HEADER什么都不管,只要把我们设置的 headerLayout 显示即可VIEW_TYPE_SEPARATOR首先拿到NavigationMenuSeparatorItem,主要是为了拿到 padding 的值,然后调用holder.itemView设置上下的 padding,这个 padding 默认值为 8dp。VIEW_TYPE_SUBHEADER拿到 TextView 设置下 title 即可。VIEW_TYPE_NORMAL
最后这个呢,对应 NavigationMenuItemView ,通过它呢去设置字体,图标,字体颜色,图标颜色,以及根据 item.getMenuItem 设置各种状态。
那么到这里呢,我们就学习完成了 NavigationMenuAdapter 它的内部的处理,那么我们的 NavigationView 已经能够正常的显示了。
显示完了之后,还有个问题, NavigationView 的 Item 是可以点击了,如果大家有印象的话, RecyclerView 自身是没有提供 Item 点击的回调的,那么 NavigationView 是如何做的。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论