没有项目可显示时隐藏recyclerview

时间:2019-08-21 08:38:59

标签: java android firebase firebase-realtime-database

隐藏RecyclerView时遇到问题。从最后两晚开始,我正在寻找解决方案,但是找不到。

我正在使用Firebase recycleradapterrecyclerview中显示值。每当有人单击viewholderitem时,我都会将其Uid保存在datasnapshot键下。

因此,如果datasnapshot没有uid键,则显示值。请显示recyclerview中的值。如果datasnapshotuid键,请不要显示其数据。一切正常。但是我想隐藏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);

3 个答案:

答案 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在滚动时被回收,如果您更改了此类属性并且从不将其返回到其自然状态,则在其他元素重用同一视图的情况下,其他元素将已经被隐藏。