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场比赛开始,我一直在寻找解决方案,但我没有找到
我正在使用firebaserecycleradapter
在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您应该使用此选项