Java 当没有要随条件显示的项目时隐藏recyclerview

Java 当没有要随条件显示的项目时隐藏recyclerview,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我面临一个隐藏RecyclerView的问题。从昨晚的2场比赛开始,我一直在寻找解决方案,但我没有找到 我正在使用firebaserecycleradapter在recyclerview中显示值。当有人单击viewholderitem时,我会在datasnapshot键下保存他的Uid 因此,要在datasnapshot没有uid键的情况下显示值,请在recyclerview中显示值。如果datasnapshot使用uid键不显示其数据。一切正常。但是我想隐藏recyclerview并显示tex

我面临一个隐藏
RecyclerView
的问题。从昨晚的2场比赛开始,我一直在寻找解决方案,但我没有找到

我正在使用firebase
recycleradapter
recyclerview
中显示值。当有人单击
viewholderitem
时,我会在
datasnapshot
键下保存他的
Uid

因此,要在
datasnapshot
没有
uid
键的情况下显示值,请在
recyclerview
中显示值。如果
datasnapshot
使用
uid
键不显示其数据。一切正常。但是我想隐藏
recyclerview
并显示
textview
,因为每个
datasnapshot
都有uid键,而
recyclerview
中没有显示任何内容。我的问题在最后一行。我无法隐藏
回收视图
以及
文本视图
的显示方式

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);
FirebaseRecyclerOptions选项=新建FirebaseRecyclerOptions.Builder()
.setQuery(ViewsRef、ViewsAdapter.class)
.build();
适配器=新的FirebaseRecyclerAdapter(选项){
@凌驾
受保护的无效onBindViewHolder(@NonNull final ViewsAdapterHolder,int position,@NonNull ViewsAdapter model){
字符串userid=getRef(position).getKey();
断言用户标识!=null;
ViewsRef.child(userid).addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot.hasChild(Uid)){
Long date=dataSnapshot.child(Uid).getValue(Long.class);
断言日期!=null;
int dat=date.intValue();
如果(日期!=日期){
RecycleView.RemoveAllView();
dataSnapshot.child(Uid).getRef().setValue(null);
adapter.startListening();
}
ViewGroup.LayoutParams LayoutParams=holder.itemView.getLayoutParams();
layoutParams.width=ViewGroup.layoutParams.MATCH_父项;
layoutParams.height=0;
holder.itemView.setLayoutParams(layoutParams);
}否则{
//从子级获取数据并显示在recyclerview中
holder.button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
@非空
@凌驾
public ViewsAdapterHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
View-View=LayoutFlater.from(viewGroup.getContext()).inflate(R.layout.viewsview,viewGroup,false);
返回新的ViewsAdapterHolder(视图);
}
};
recyclerView.setAdapter(适配器);
我使用了adapter.registerAdapterDataObserver()方法,但它不起作用

我不知道您是如何使用
registerAdapterDataObserver()
的,但下面是使用它的正确方法。因此,要知道查询返回的项数,您需要使用
getItemCount()
适配器类中存在的方法。由于Firebase实时数据库中的数据是异步加载的,因此不能简单地调用
getItemCount()
直接在适配器类中,因为它总是0。因此,为了获得项目总数,您需要注册一个观察者,如以下代码行所示:

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);
        }
    }
});
我使用了adapter.registerAdapterDataObserver()方法,但它不起作用

我不知道您是如何使用
registerAdapterDataObserver()
的,但下面是使用它的正确方法。因此,要知道查询返回的项数,您需要使用
getItemCount()
适配器类中存在的方法。由于Firebase实时数据库中的数据是异步加载的,因此不能简单地调用
getItemCount()
直接在适配器类中,因为它总是0。因此,为了获得项目总数,您需要注册一个观察者,如以下代码行所示:

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) {
        }
    });
}

所以你想在没有孩子的时候躲起来

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在滚动时是循环使用的,如果您更改了这样的属性,并且从未将其恢复到自然状态,则其他元素在重用同一视图时将已经隐藏。

在某些情况下,仅更改可见性,该属性仍可能最终被分配为空白空间(因为父视图的填充、边距、内部元素等)。然后更改父视图的高度有助于:

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会被回收,如果您更改这样的属性并且从不将它们返回到其自然状态,那么其他元素将在它们重用同一视图时被隐藏。

我应该在哪里使用它?在onstart方法中?@Alex您应该使用此选项