[英]Hide recyclerview when there is no item to show with condition
我面临隐藏RecyclerView
的问题。 从昨晚开始,我一直在寻找解决方案,但没有找到。
我正在使用 firebase recycleradapter
在recyclerview
显示价值。 当有人单击viewholderitem
我将他的Uid
保存在datasnapshot
键下。
因此,如果datasnapshot
没有uid
键, datasnapshot
显示该值,请在recyclerview
显示该值。 如果数据datasnapshot
有uid
键,则不显示他的数据。 一切正常。 但我想隐藏recyclerview
和显示textview
当每一个datasnapshot
有UID键并没有什么在显示recyclerview
。 我的问题在最后一行。 我无法隐藏recyclerview
以及textview
。
FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<ViewsAdapter>()
.setQuery(ViewsRef,ViewsAdapter.class)
.build();
adapter = new FirebaseRecyclerAdapter<ViewsAdapter, ViewsAdapterHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final ViewsAdapterHolder holder, int position, @NonNull ViewsAdapter model) {
String userIds = getRef(position).getKey();
assert userIds != null;
ViewsRef.child(userIds).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(Uid)){
Long date = dataSnapshot.child(Uid).getValue(Long.class);
assert date != null;
int dat = date.intValue();
if (dat!=Date){
recyclerView.removeAllViews();
dataSnapshot.child(Uid).getRef().setValue(null);
adapter.startListening();
}
ViewGroup.LayoutParams layoutParams =holder.itemView.getLayoutParams();
layoutParams.width= ViewGroup.LayoutParams.MATCH_PARENT;
layoutParams.height= 0;
holder.itemView.setLayoutParams(layoutParams);
}else {
//get the data from child and show in recyclerview
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@NonNull
@Override
public ViewsAdapterHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.viewsview,viewGroup,false);
return new ViewsAdapterHolder(view);
}
};
recyclerView.setAdapter(adapter);
我用过adapter.registerAdapterDataObserver(); 方法,但它不起作用。
我不知道你是如何使用registerAdapterDataObserver()
但这里是使用它的正确方法。 因此,要了解查询返回的项目数,您需要使用适配器类中存在的getItemCount()
方法。 由于来自 Firebase 实时数据库的数据是异步加载的,因此您不能直接在适配器类中直接调用getItemCount()
,因为它始终为零。 因此,为了获得项目总数,您需要像以下代码行一样注册一个观察者:
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
public void onItemRangeInserted(int positionStart, int itemCount) {
int totalNumberOfItems = adapter.getItemCount();
Log.d(TAG, String.valueOf(totalNumberOfItems));
if(totalNumberOfItems == 0) {
recyclerView.setVisibility(View.GONE);
emptyInfoTextView.setVisibility(View.VISIBLE);
}
}
});
所以你想在没有孩子的时候躲起来吗?
if (dataSnapshot.hasChild(Uid)){
//your stuff...
}else {
//set data in viewholder . it works fine
//Here you hide it.
emptyInfoTextView.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
在某些情况下,仅更改可见性,该属性可能仍以分配的空白空间结束(因为父视图的填充、边距、内部元素等)。 然后更改父视图的高度有助于:
holder.itemView.setVisibility(View.GONE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
然后确保在它应该可见的条件下,还设置:
holder.itemView.setVisibility(View.VISIBLE);
holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
您需要这样做,因为 viewHolder 在您滚动时会被回收,如果您像这样更改属性并且永远不会将它们恢复到其自然状态,则其他元素将在它们重用相同视图的情况下已经隐藏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.