如何在屏幕上设置两个相同大小的RecyclerView,保持高度换行内容以避免空白

时间:2019-01-21 18:58:44

标签: android layout android-recyclerview height android-layout-weight

我想在高度相等的屏幕上设置两个0.171 <= par[1] <= 0.204,以平均覆盖屏幕,问题是,如果我使用高度,因为RecyclerView的视图不能平均展开,并且如果我固定它们的高度或给它们wrap_content,如果其中一个列表为空,则会出现空格。

如果这些列表中的一个为空,并且两个列表中都有数据,那么我希望这些列表不占用空间,那么它们将在屏幕上覆盖相等的空间。

2 个答案:

答案 0 :(得分:3)

您不能仅在XML中执行此操作。您将需要一些Java。您的布局权重在正确的轨道上。

骨架XML:

<LinearLayout
    android:orientation="vertical">

    <RecyclerView
        android:id="@+id/recView1"
        android:layout_height="0dp"
        android:layout_weight="1"
    />

    <RecyclerView
        android:id="@+id/recView2"
        android:layout_height="0dp"
        android:layout_weight="1"
    />

</LinearLayout>

下一部分需要用Java完成。

将数据观察器添加到两个适配器,并确保覆盖所有方法并使它们调用onChanged()。然后,在onChanged()内,检索当前适配器的计数并适当设置RecyclerView的可见性。

这是第一个例子:

recView1.getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        recView1.setVisibility(recView1.getAdapter().getItemCount() > 0 ? View.VISIBLE : View.GONE);
    }

    @Override
    public void onItemRangeChanged(int positionStart, int itemCount) {
        onChanged();
    }

    @Override
    public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
        onChanged();
    }

    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        onChanged();
    }

    @Override
    public void onItemRangeRemoved(int positionStart, int itemCount) {
        onChanged();
    }

    @Override
    public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
        onChanged();
    }
}

实际上,您可能应该将两个观察者都提取到变量中,以便在包含的Activity / Window /任何对象被破坏时可以注销它们。

答案 1 :(得分:0)

使用以下代码 希望它能工作

int x=this. getResources().getDisplayMetrics().heightPixels*1/2;
recyclerview1.setLayoutParams(new LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.WRAP_CONTENT, x));
recyclerview2.setLayoutParams(new LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.WRAP_CONTENT, x));