Recyclerview 中的 view.GONE 仍然保留空间

Posted

技术标签:

【中文标题】Recyclerview 中的 view.GONE 仍然保留空间【英文标题】:view.GONE in Recyclerview still keeps space 【发布时间】:2017-06-22 16:42:46 【问题描述】:

我在网上搜索并发现view.invisible和view.gone之间存在差异,vie.gone必须在不保留空间的情况下消失,但我没有发生这种情况,我该如何解决?请帮忙,看看两张图片的链接。

android 模拟器上的结果图片:https://i.stack.imgur.com/AC1Xr.png

数据库:https://i.stack.imgur.com/Pwhno.png

@Override
protected void onStart() 
    super.onStart();

    final FirebaseRecyclerAdapter<MyReading, MyReadingViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter <MyReading, MyReadingViewHolder>
            (
            MyReading.class,
            R.layout.list_reading,
            MyReadingViewHolder.class,
            mQuery )

    
        @Override
        protected void populateViewHolder(final MyReadingViewHolder viewHolder, MyReading model, int position) 

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

            viewHolder.setWord(model.getWord());
            viewHolder.setNote(model.getNote());


            mDatabase.child(wordNote_key).addValueEventListener(new ValueEventListener() 
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) 

                    String currentUid = (String) dataSnapshot.child("uid").getValue();

                    if(firebaseauth.getCurrentUser().getUid().equals(currentUid))

                      viewHolder.nView.setVisibility(View.VISIBLE);
                    
                    else
                    
                        viewHolder.nView.setVisibility(View.GONE);
                    

                

                @Override
                public void onCancelled(DatabaseError databaseError) 

                
            );

            viewHolder.nView.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 

                    Intent singleIntent = new Intent(WordNote.this, HandleWordNote.class);
                    singleIntent.putExtra("listWords", wordNote_key);
                    startActivity(singleIntent);

                
            );
        
    ;

    listWN.setAdapter(firebaseRecyclerAdapter);

【问题讨论】:

请不要发布代码图片(您可以编辑问题并复制粘贴代码)并且图片似乎相同 您是要完全删除 ViewHolder,还是只是修改它以使里面的视图消失? @PabloBaxter 嗨,我不想完全删除它,因为在这个项目中,当两个用户在同一个“区域”工作时我会遇到这个问题,所以我必须通过查询将他们的工作分开,实际上是您可以在顶部看到“mQuery”,看我从数据库中获取数据,这是 (String currentUid = (String) dataSnapshot.child("uid").getValue();) 所以我可以说如果你是另一个用户,您无法观看其他用户的工作,但是 View.GONE 没有消失的背景事物,请帮助我,我很沮丧老实说;我在这个问题的顶部更新了图片的链接 【参考方案1】:

编辑

好的,所以在看到更新的图像后,我看到了真正的问题。在您的查询中,添加约束以仅返回具有当前用户 uid 的数据快照。问题是即使您的视图是GONE,视图本身仍将保持该位置,因为该位置有一个模型对象。与其破解FirebaseRecyclerAdapter,不如使用您传入的Query 对象过滤掉列表中不需要的数据。


您是否尝试将更改通知适配器?仅仅因为您修改了子视图,并不意味着适配器会自动将 viewHolder 调整为适当的大小。

mDatabase.child(wordNote_key).addValueEventListener(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 

        String currentUid = (String) dataSnapshot.child("uid").getValue();

        if(firebaseauth.getCurrentUser().getUid().equals(currentUid))

          viewHolder.nView.setVisibility(View.VISIBLE);
        
        else
        
            viewHolder.nView.setVisibility(View.GONE);
        
        //Notify the adapter the viewholder at this position changed.
        notifiyItemChanged(position);
    

    @Override
    public void onCancelled(DatabaseError databaseError) 

    
);

【讨论】:

它不起作用,没有任何改变,我真的不明白问题出在哪里..我听说有人使用布局参数 查询是这样的: mQuery = mDatabase.orderByChild("book").equalTo(bookYouAreIn);我将 Firebase 用作数据库,通过使用此查询,如果我点击另一本书,它会打开然后点击这本书,你知道我的意思吗?然后我通过用户 ID 过滤以选择要隐藏的内容 你能发布一个你试图查询的数据结构的例子吗? 我在问题中发布了数据库的链接,请检查:i.stack.imgur.com/Pwhno.png 你试过mDatabase.orderByChild("book").equalTo(bookYouAreIn).equalTo("uid", firebaseauth.getCurrentUser().getUid())作为你的mQuery参数吗?从外观上看,您拥有使用用户 uid 注释的数据和书籍,因此限制只返回带有用户的那些似乎是答案。【参考方案2】:

有一种解决方法,您可以将 viewHolder 的视图高度设置为零。

val layoutParamter = holder.mView.layoutParams
layoutParamter.height = 0
holder.mView.layoutParams = layoutParamter

【讨论】:

以上是关于Recyclerview 中的 view.GONE 仍然保留空间的主要内容,如果未能解决你的问题,请参考以下文章

必须是以下之一:View.VISIBLE、View.INVISIBLE、View.GONE [重复]

如果搜索,则在方向更改时不会恢复工具栏中的搜索图标

如何使reyclerview项目可见并且不留空间--Kotlin?

如何从 View.gone 恢复视图。在xml中使用'android:visibility =“gone”'后setVisibility(View.VISIBLE)不起作用

ViewStub 与 View.GONE

Android:为啥要设置可见性(View.GONE);或 setVisibility(View.INVISIBLE);不工作