android recyclerview setVisibility View.GONE 仍然占用空间

标签 android android-recyclerview visibility cardview

我只想在我的回收站 View 中列出不喜欢的项目。我在 MainActivity 的 rv 中有一个完整的项目列表(这里没有设置可见性)。我可以通过单击图像按钮为每个项目设置喜欢或不喜欢。 MainActivity 显示了显示图像按钮喜欢与否的项目(卡片 View )的完整列表。如果项目被喜欢,这将作为单独的条目存储在 firebase db 中,位于 Likes with item key (firebase key .push) 下,而不是 Items 下。 (在 firebase db 中,我有用户、项目、喜欢)。

这是我的子 Activity 代码 DislikedItemsActivity,我想在其中通过对喜欢的项目使用 setVisibility(View.GONE) 来仅显示不喜欢的项目。这仍然保留了 View.GONE 项目之间的空间(尽管这些卡片 View 是空的)。

mRecyclerView = (RecyclerView) findViewById(R.id.rvItemList);
mRecyclerView .setHasFixedSize(true);

final LinearLayoutManager linearLayoutManager = new 
LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true); 

mRecyclerView.setLayoutManager(linearLayoutManager);

final FirebaseRecyclerAdapter<Item, MainActivity.ItemViewHolder> 
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Item, 
MainActivity.ItemViewHolder>(
            Item.class,
            R.layout.list_item,
            MainActivity.ItemViewHolder.class,
            mDatabase

    ) {
        @Override
        protected void populateViewHolder(final MainActivity.ItemViewHolder viewHolder, final Item model, final int position) {

            final String itemKey = getRef(position).getKey();

            mDatabaseItemsLiked.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

        // if item is not liked, thus no user set in db ( I want to see only items that are liked in my recyclerview)
                    if (!dataSnapshot.child(itemKey).hasChild(mAuth.getCurrentUser().getUid())) {

                        viewHolder.mView.setVisibility(View.VISIBLE);

                        viewHolder.itemNameSetup(model.getItemName());
                        viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                                Intent itemSheetIntent = new Intent(DislikedItemsActivity.this, ItemSheetActivity.class);
                                adatlapIntent.putExtra("item_key", itemKey);
                                startActivity(itemSheetIntent);
                            }
                        });

                    } else {

                        viewHolder.mView.setVisibility(View.GONE);

                        mRecyclerView.getAdapter().notifyItemRemoved(position); //this puts together the visible items, but when scrolling, it gets messed up

        }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.e(TAG, databaseError.toString());
                }
            });
        }

        @Override
        public void onBindViewHolder(MainActivity.TermekViewHolder viewHolder, int position) {
            super.onBindViewHolder(viewHolder, position);

        }
    };
    mRecyclerView.setAdapter(firebaseRecyclerAdapter);
}

我寻找了许多解决方案,例如 onBindViewHolder、notifyDataChanged、将边距设置为 0、将 xml 中的布局大小设置为 wrap_content。我能得到的最好的结果是使用 mRecyclerView.getAdapter().notifyItemRemoved(position); 让不喜欢的项目没有空间,但是向后滚动列表整个 rv 会变得困惑(重复条目、空白、无序列表)。

我不知道如何在新 Activity 中从 MainActivity rv 的完整项目列表中仅列出不喜欢的项目?我上面的代码只显示不喜欢的项目,但只有在我滚动到列表末尾时,如果我向后滚动,rv 才会变得困惑。我在 onBindViewHolder 中记录了 View (18 个项目)的位置,首先它按顺序计算所有项目(17、16、15、14 ... 0),但是从列表末尾向后滚动位置从 0 跳到 4,就像 7 次(总是改变多少次)然后它与项目 5,6 相同,直到项目 17(它们的所有位置在滚动期间在 onBindViewHolder 中显示 7 或 8 次,即 5,5,5,5,6,6,6 ,6) 且仅用于向后滚动和向后移动期间 rv 仅显示不喜欢的项目或空 View 或不喜欢项目的重复条目。

我的 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="horizontal"
android:background="@drawable/hatter"
tools:context="com.example.user.itemlist.ItemsLikedActivity">

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rvItemList"
    >
</android.support.v7.widget.RecyclerView>

(不知道如何添加图片)当不喜欢的列表出现时,它显示第一个项目(cardview 占据全屏),当我开始滚动列表时(从 1.可见项目到下一个可见项目)如果有空间(item1 vis 和 next vis item 是 4),重新排列,我可以看到下一个可见项目(item4)移动到 1.visible item,然后列表的其余部分安排得很好,直到我开始向后滚动,然后它用空格和复式重新排列 rv。该列表来回移动直到两端(这是完整项目列表的长度,而不仅仅是不喜欢的项目),但是可见的项目都搞砸了。

最佳答案

使用此代码删除占用的空间:

ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
params.height = 0;
holder.itemView.setLayoutParams(params);

关于android recyclerview setVisibility View.GONE 仍然占用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46276641/

相关文章:

android - 尝试在Android Studio中使用Gradle进行构建时出错

Java函数在执行之前返回一个值

android - 使用 volley 将数据从 recyclerview 存储在 mysql 中

android - 当点击 recyclerView 中的另一个位置时,setVisibility 如何消失所有其他位置?

asp.net - Gridview 页脚不可见

android - 使用 createComposeRule 运行 Jetpack Compose UI 测试时出现 "RuntimeException: Could not launch activity...Unable to resolve activity for Intent"

Android EditText 阻止其父级的 OnClickListener

android - 垂直 ScrollView 中的水平 Recyclerview

android - 当按钮消失时更改按钮 S 的按钮对齐方式

Swift 3 从扩展访问结构中的私有(private)属性