gpt4 book ai didi

android - RecycleView 由于工具栏而在底部留下空白

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:35 31 4
gpt4 key购买 nike

更新:

  • 实际问题出在 CoordinatorLayout 而不是 RecycleView
  • 我没有使用 RecycleView,而是在 ScrollView 中尝试了 TextView,这是同样的问题。
  • 如果您将 Toolbar 作为 ActionBar 并将 CoordinatorLayout 与另一个 ToolBar 一起使用,则某些内容未对齐作为底部带有滚动元素的粘性标题

原文:

我正在开发一个 View ,该 View 需要在底部使用回收 View 实现粘性 header 。我用过Coordinator layout support如此处所述。

什么是工作:

  • 滚动列表上的粘性 View 。
    • 工具栏使用 layout_collapseMode = pin & CollapsingToolbarLayout 使用 layout_scrollFlags = scroll|exitUntilCollapsed|snap 属性(property)。
    • 回收具有行为的 View app:layout_behavior="@string/appbar_scrolling_view_behavior"

问题是什么:

  • 回收 View 在底部留有边距,它的大小与我用于粘性 View 的工具栏相同。
  • 回收 View 最后一项不显示,它需要额外的 bottom_margin 作为粘性工具栏 View 的大小。

观察:

  • 如果我立即填充回收站,它就会起作用。但是,如果延迟通知它,则会导致问题。
  • 更新。在另一个试验和运行**中,我没有使用 Recycle,而是在 NestedScrollView 中放置了一个 TextView。(PFA)(此处布局未更新)
    • 我在这里添加了来自 xml 的文本,并在延迟 2 秒后添加更多文本,结果相同。
    • 再次采用底部边距的布局。所以与 Recycle view 没有什么特别相关的,似乎 CoordinatorLayout 有一些问题。

我尝试了多种可用的解决方案 here , here , 但没有工作。

PFA,电流输出。

enter image description here

更新 PFA,尝试延迟 TextView 。

enter image description here

这是布局文件。

<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.material.appbar.AppBarLayout
android:id="@+id/summaryAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/main.collapsing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="256dp"
android:background="@drawable/fable_1"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.3" />

<!-- This is sticky header-->
<androidx.appcompat.widget.Toolbar
android:id="@+id/summaryToolBar"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_gravity="center"
android:background="@android:color/white"
android:padding="@dimen/common_layout_margin"
android:visibility="visible"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Name" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:textSize="24sp"
android:text="Offer"/>

</FrameLayout>

</androidx.appcompat.widget.Toolbar>

</com.google.android.material.appbar.CollapsingToolbarLayout>

</com.google.android.material.appbar.AppBarLayout>

<!-- Bottom margin if I do't use then it does not display last child item. Wired but true in this case-->

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:visibility="visible"
android:layout_marginBottom="72dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:listItem="@layout/item_dessert" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

最佳答案

我相信 CoordinatorLayout(可能是 AppBarLayoutCollapsingToolbarLayout - 不确定是哪个组件)记录了错误的 CollapsingToolbarLayout 由于粘性工具栏。如果项目是在初始布局之前或之后添加的,则行为会有所不同。

尝试以下操作:

  1. RecyclerView 的 XML 中删除 android:layout_marginBottom="72dp"
  2. android:minHeight="72dp" 添加到 CollapsingToolbarLayout 的 XML 中

由于您的粘性工具栏设置为 72dp,因此可以将 minHeight 设置为 72dp

如果您对此有疑问,请在此处发帖。


这是使用 NestedScrollView 和上述更改的布局的快速演示。

更新:我已经使用显示相同问题的 RecyclerView 解决了这个问题。显示问题和修复的演示项目在 GitHub 上.

enter image description here

代码如下:

MainActivity.java

public class MainActivity extends AppCompatActivity {  
// Set to true to break the layout; false for it to work.
// The setting of this flag should only matter for the
// layout activity_not_working.
private boolean mBreakIt = true;

// private int mLayoutToUse = R.layout.activity_not_working;
private int mLayoutToUse = R.layout.activity_working;

private LinearLayout mLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(mLayoutToUse);

mLayout = findViewById(R.id.linearLayout);
if (mBreakIt) {
mLayout.post(new Runnable() {
@Override
public void run() {
addViews();
}
});
} else {
addViews();
}
}

private void addViews() {
for (int i = 0; i < 50; i++) {
TextView tv = new TextView(MainActivity.this);
tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
tv.setText("TextView #" + (i + 1));
mLayout.addView(tv);
}
}
}

activity_working.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout 
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.material.appbar.AppBarLayout
android:id="@+id/summaryAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/main.collapsing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="72dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="256dp"
android:background="@drawable/beach"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.3" />

<!-- This is sticky header-->
<androidx.appcompat.widget.Toolbar
android:id="@+id/summaryToolBar"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_gravity="center"
android:background="@android:color/white"
android:padding="@dimen/common_layout_margin"
android:visibility="visible"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
android:textSize="24sp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="Offer"
android:textSize="24sp" />

</FrameLayout>

</androidx.appcompat.widget.Toolbar>

</com.google.android.material.appbar.CollapsingToolbarLayout>

</com.google.android.material.appbar.AppBarLayout>

<!-- Bottom margin if I do't use then it does not display last child item. Wired but true in this case-->
<!-- Removed following: -->
<!--android:layout_marginBottom="72dp"-->

<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_light"
android:visibility="visible"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:layout_insetEdge="bottom"
tools:listItem="@layout/item_dessert">

<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />


</LinearLayout>
</androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

activity_not_working.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout 
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.material.appbar.AppBarLayout
android:id="@+id/summaryAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/main.collapsing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="256dp"
android:background="@drawable/beach"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.3" />

<!-- This is sticky header-->
<androidx.appcompat.widget.Toolbar
android:id="@+id/summaryToolBar"
android:layout_width="match_parent"
android:layout_height="72dp"
android:layout_gravity="center"
android:background="@android:color/white"
android:padding="@dimen/common_layout_margin"
android:visibility="visible"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
android:textSize="24sp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="Offer"
android:textSize="24sp" />

</FrameLayout>

</androidx.appcompat.widget.Toolbar>

</com.google.android.material.appbar.CollapsingToolbarLayout>

</com.google.android.material.appbar.AppBarLayout>

<!-- Bottom margin if I do't use then it does not display last child item. Wired but true in this case-->
<!-- Removed following: -->
<!--android:layout_marginBottom="72dp"-->

<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="72dp"
android:background="@android:color/holo_blue_light"
android:visibility="visible"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:layout_insetEdge="bottom"
tools:listItem="@layout/item_dessert">

<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="A TextView" />


</LinearLayout>
</androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

关于android - RecycleView 由于工具栏而在底部留下空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54939845/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com