- 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.1 寻找 RecyclerView
那么,既然我们已经清楚 NavigationView
内部其实就是 RecyclerView
实现了,那么接下来看源码的过程,就可以有针对有目的的去阅读了。
首先看 NavigationView
的构造方法:
#NavigationView public class NavigationView extends ScrimInsetsFrameLayout { private final NavigationMenu mMenu; private final NavigationMenuPresenter mPresenter = new NavigationMenuPresenter(); private OnNavigationItemSelectedListener mListener; private int mMaxWidth; private MenuInflater mMenuInflater; public NavigationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); ThemeUtils.checkAppCompatTheme(context); // Create the menu mMenu = new NavigationMenu(context); //省略了获取部分自定义属性的代码 mMenu.setCallback(new MenuBuilder.Callback() { @Override public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { return mListener != null && mListener.onNavigationItemSelected(item); } @Override public void onMenuModeChange(MenuBuilder menu) {} }); mPresenter.setId(PRESENTER_NAVIGATION_VIEW_ID); mPresenter.initForMenu(context, mMenu); mPresenter.setItemIconTintList(itemIconTint); if (textAppearanceSet) { mPresenter.setItemTextAppearance(textAppearance); } mPresenter.setItemTextColor(itemTextColor); mPresenter.setItemBackground(itemBackground); mMenu.addMenuPresenter(mPresenter); addView((View) mPresenter.getMenuView(this)); if (a.hasValue(R.styleable.NavigationView_menu)) { inflateMenu(a.getResourceId(R.styleable.NavigationView_menu, 0)); } if (a.hasValue(R.styleable.NavigationView_headerLayout)) { inflateHeaderView(a.getResourceId(R.styleable.NavigationView_headerLayout, 0)); } a.recycle(); }
NavigationView
是继承自 FrameLayout 的,首先我们看起构造方法,因为我们刚才已经预先说明其内部是 RecyclerView
实现的,那么我们首先定位在哪里加入的 RecyclerView
.
关注到上述代码的 39 行:
addView((View) mPresenter.getMenuView(this));
这里添加了一个 view,调用是 mPresenter.getMenuView
,源码更进去,可以看到
#NavigationMenuPresenter @Override public MenuView getMenuView(ViewGroup root) { if (mMenuView == null) { mMenuView = (NavigationMenuView) mLayoutInflater.inflate( R.layout.design_navigation_menu, root, false); if (mAdapter == null) { mAdapter = new NavigationMenuAdapter(); } mHeaderLayout = (LinearLayout) mLayoutInflater .inflate(R.layout.design_navigation_item_header, mMenuView, false); mMenuView.setAdapter(mAdapter); } return mMenuView; }
这个方法返回值是 NavigationMenuView
,而这个类实际上继承自 RecyclerView
。除此以外呢,可以看到这里还初始化了 NavigationMenuAdapter
,并且调用了 setAdapter()
;以及初始化了 mHeaderLayout
。顾名思义,adapter 肯定是为 RecyclerView
准备的,而 mHeaderLayout
肯定是用于放置我们设置的 app:headerLayout
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论