view.GONE 在 Recyclerview 中仍然保持 space
view.GONE in Recyclerview still keeps space
我在网上搜索了一下,发现view.invisible和view.gone是有区别的,vie.gone必须消失而不保留space,但它不会发生在我身上,我该如何解决?请帮助,查看两张图片的链接。
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);
}
编辑
好的,所以在看到更新后的图像后,我看到了真正的问题。在您的查询中,将约束添加到仅 return 具有当前用户 uid 的数据快照。问题是,即使您的 viewholder 的视图是 GONE
,viewholder 本身仍将保持该位置,因为该位置有一个模型对象。与其砍掉 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) {
}
});
有一个解决方法,您可以将 viewHolder 的视图高度设置为零。
val layoutParamter = holder.mView.layoutParams
layoutParamter.height = 0
holder.mView.layoutParams = layoutParamter
我在网上搜索了一下,发现view.invisible和view.gone是有区别的,vie.gone必须消失而不保留space,但它不会发生在我身上,我该如何解决?请帮助,查看两张图片的链接。
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);
}
编辑
好的,所以在看到更新后的图像后,我看到了真正的问题。在您的查询中,将约束添加到仅 return 具有当前用户 uid 的数据快照。问题是,即使您的 viewholder 的视图是 GONE
,viewholder 本身仍将保持该位置,因为该位置有一个模型对象。与其砍掉 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) {
}
});
有一个解决方法,您可以将 viewHolder 的视图高度设置为零。
val layoutParamter = holder.mView.layoutParams
layoutParamter.height = 0
holder.mView.layoutParams = layoutParamter