RecyclerView创建的NavigationView
中有4种类型的项:
@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;
}
你感兴趣的是SubheaderViewHolder
。R.layout.design_navigation_item_subheader
是该ViewHolder
所需填充的布局。
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/listPreferredItemHeightSmall"
android:gravity="center_vertical|start"
android:maxLines="1"
android:paddingLeft="?attr/listPreferredItemPaddingLeft"
android:paddingRight="?attr/listPreferredItemPaddingRight"
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textColor="?android:textColorSecondary"/>
listPreferredItemHeightSmall
属性中获取的。但是,仅通过更改listPreferredItemHeightSmall
的值无法实现您的要求,因为NormalViewHolder
的项目也依赖于该值,因此更改它将影响所有其他项目。
一种难以靠谱的方法是使用 getIdentifier()
API 在运行时获取此 RecyclerView
。 自定义 RecyclerView
的id为 design_navigation_view
。 获取后,您可以手动从 RecyclerView
中获取实际的 View
(知道您需要哪个子项)。 然后,您可以手动更改该 View
的高度。 但这不可靠,因为:
对于许多此类项,处理起来并不容易,因为您无法知道实际显示了多少项(好吧,您可以,但值得吗?)
必须监听滚动事件并检测何时显示了任何新的 SubheaderViewHolder
- 然后应用自定义高度。
NavigationView
的内容提供。根据我的经验,处理导航抽屉最好的方式是让它显示一个完整的Fragment
。这样可以完全控制其布局和行为。
(RecyclerView) ((NavigationView) findViewById(R.id.navigation)).getChildAt(0);
从NavigationView中获取recyclerView,所以我的计划是从每个viewholder中获取视图,但目前为止我还没能做到。你有这样做过吗? - Gaston Flores通过覆盖 Android 支持库中已设置的值,更改 dimen.xml
中的值。
<dimen name="design_navigation_padding_top_default"
tools:override="true">0dp</dimen>
<dimen name="design_navigation_separator_vertical_padding"tools:override="true">0dp</dimen>
<dimen name="design_navigation_padding_bottom"tools:override="true">0dp</dimen>