隐藏RecyclerView
时遇到问题。从最后两晚开始,我正在寻找解决方案,但是找不到。
我正在使用Firebase recycleradapter
在recyclerview
中显示值。每当有人单击viewholderitem
时,我都会将其Uid
保存在datasnapshot
键下。
因此,如果datasnapshot
没有uid
键,则显示值。请显示recyclerview
中的值。如果datasnapshot
有uid
键,请不要显示其数据。一切正常。但是我想隐藏recyclerview
并在每个textview
拥有uid键并且在datasnapshot
中没有任何内容的情况下显示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);
答案 0 :(得分:1)
我使用了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);
}
}
});
答案 1 :(得分:0)
所以你想在没有孩子的时候躲起来吗?
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) {
}
});
}
答案 2 :(得分:0)
在某些情况下,仅更改可见性,该属性可能仍会以分配的空白结尾(由于父视图的填充,边距,内部元素等)。然后更改父视图的高度会有所帮助:
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在滚动时被回收,如果您更改了此类属性并且从不将其返回到其自然状态,则在其他元素重用同一视图的情况下,其他元素将已经被隐藏。