【问题标题】:How to set two RecyclerView of equal size on a screen, keeping height wrap content to avoid white space如何在屏幕上设置两个大小相等的 RecyclerView,保持高度环绕内容以避免空白
【发布时间】:2019-06-15 05:10:46
【问题描述】:

我想在相同高度的屏幕上设置两个RecyclerViews 以平均覆盖屏幕,问题是,如果我使用高度作为wrap_content 视图不会平均扩展,如果我固定它们的高度或给他们layout_weight,如果列表之一为空,就会有空格。

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

【问题讨论】:

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


    【解决方案1】:

    使用下面的代码 希望它会工作

    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));
    

    【讨论】:

    • 所有这些都是在 XML 中已经完成的。它没有考虑空列表要求。
    【解决方案2】:

    您不能仅在 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/whatever 被销毁时取消注册它们。

    【讨论】:

    • 我用 adapter.registerAdapterDataObserver(mObserver); 提取了 AdapterDataObserver。那么如何访问 registerAdapterDataObserver 的覆盖方法,如 onChanged()?这会工作“mObserver = new RecyclerView.AdapterDataObserver { ...}”然后在其中添加覆盖方法吗?
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2014-09-19
    相关资源
    最近更新 更多