繁体   English   中英

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

[英]Hide recyclerview when there is no item to show with condition

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

我正在使用 firebase recycleradapterrecyclerview显示价值。 当有人单击viewholderitem我将他的Uid保存在datasnapshot键下。

因此,如果datasnapshot没有uid键, datasnapshot显示该值,请在recyclerview显示该值。 如果数据datasnapshotuid键,则不显示他的数据。 一切正常。 但我想隐藏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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM