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)不起作用
Android:为啥要设置可见性(View.GONE);或 setVisibility(View.INVISIBLE);不工作