热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从Firebase数据库中随机播放项目

如何从Firebase数据库中随机播放项目?假设我的数据库包含4个项目[1,2,3,4]。在我的Recy

如何从Firebase数据库中随机播放项目?

假设我的数据库包含4个项目[1,2,3,4]。在我的RecyclerView中,我想显示随机播放的内容,例如[2,1,4]。我该怎么办?

这是我的片段中的代码。因此它可以检索数据,但在显示之前我需要先对其进行洗牌。

RecyclerView mRecyclerView;
FirebaseDatabase mFirebaseDatabase;
DatabaseReference mRef;
@Override
public View onCreateView(@NotNull LayoutInflater inflater,ViewGroup viewGroup,Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_store,viewGroup,false);
setHasOptionsMenu(false);
mRecyclerView = rootView.findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new GridLayoutManager(getactivity(),3));
mFirebaseDatabase = FirebaseDatabase.getInstance();
mRef = mFirebaseDatabase.getReference("Store");
}
return rootView;
}

要从Firebase数据库检索数据,我使用以下代码:

@Override
public void onStart() {
super.onStart();
FirebaseRecyclerOptions optiOns=
new FirebaseRecyclerOptions.Builder()
.setQuery(mRef,Store2.class)
.build();
FirebaseRecyclerAdapter firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter(options) {
@NonNull
@Override
public StoreHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(parent.getcontext())
.inflate(R.layout.store_gridview,parent,false);
return new StoreHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull final StoreHolder holder,int position,@NonNull final Store2 model) {
holder.setDetails(getcontext(),model.getImage(),model.getName(),model.getPrice());
}
};
firebaseRecyclerAdapter.startListening();
mRecyclerView.setadapter(firebaseRecyclerAdapter);
}


shuffling中的firebase数据不可用。
但是您可以在本地进行。

在此传递您的列表。

Collections.shuffle(arrayList);

,

使用以下参考时:

mRef = mFirebaseDatabase.getReference("Store");

这意味着您正在尝试显示Store节点下存在的所有子级。如果在此节点下存储使用push()方法添加的子级,则默认顺序为按时间顺序,因为每个推送的ID都包含一个时间分量。如果要更改此行为,则需要获取所有项目并手动将其洗牌。

正如@DougStevenson在其评论中提到的那样,您必须使用相同的引用,获取所有项目,将它们添加到列表中,将它们混洗,然后为此使用ListAdapter

还请注意,当您将DocumentReferenceQuery对象传递给setQuery()方法时,没有其他机制可以帮助您重新整理项目。不幸的是,您将失去Firebase-UI库的优势,但您会完成工作。

,

正如@DougStevenson和@frankenstein所述,我将所有项目添加到列表中,然后可以使用Collections.shuffle(arrayList);对其进行洗牌

我无法使用FirebaseRecyclerAdapter来做到这一点,我需要为Adapter使用自定义RecyclerView.ViewHolder

不使用FirebaseRecyclerAdapter有什么弊端?还是什么?也许有经验的人可以回答这个问题。

我的片段:

private View rootView;
private RecyclerView recyclerView;
private StoreAdapter storeAdapter;
private ArrayList arrayStore;
@Override
public View onCreateView(@NotNull LayoutInflater inflater,ViewGroup viewGroup,Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_store,viewGroup,false);
setHasOptionsMenu(false);
recyclerView = rootView.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),3));
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Data");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
arrayStore = new ArrayList<>();
for(DataSnapshot snapshot: dataSnapshot.getChildren()) {
Store store = snapshot.getValue(Store.class);
arrayStore.add(store);
}
storeAdapter = new StoreAdapter(getActivity(),arrayStore);
recyclerView.setAdapter(storeAdapter);
Collections.shuffle(arrayStore,new Random(3));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
return rootView;
}

我的适配器:

private final Context context;
private ArrayList arrayStore;
public StoreAdapter(Context context,ArrayList arrayStore) {
this.cOntext= context;
this.arrayStore = arrayStore;
}
@NonNull
@Override
public StoreAdapter.GameViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,int i) {
return new StoreAdapter.GameViewHolder(LayoutInflater.from(context).inflate(
R.layout.store_gridview,false));
}
@Override
public void onBindViewHolder(@NonNull final StoreAdapter.GameViewHolder viewHolder,final int position) {
setColor(viewHolder);
viewHolder.itemName.setText(arrayStore.get(position).getName());
Glide.with(viewHolder.view.getContext())
.load(arrayStore.get(position).getImage())
.thumbnail(0.75f)
.into(viewHolder.itemImage);
viewHolder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendData(viewHolder,position);
}
});
}
@Override
public int getItemCount() {
return arrayStore.size();
}
class GameViewHolder extends RecyclerView.ViewHolder {
private final View view;
private final ImageView itemImage,itemRarity;
private final TextView itemName;
GameViewHolder(@NonNull View itemView) {
super(itemView);
this.view = itemView;
itemRarity = view.findViewById(R.id.itemRarity);
itemImage = view.findViewById(R.id.itemImage);
itemName = view.findViewById(R.id.itemName);
}
}
private void sendData(@NonNull final StoreAdapter.GameViewHolder viewHolder,int position) {
if (viewHolder.getAdapterPosition() != RecyclerView.NO_POSITION) {
Intent intent = new Intent(context,DetailsActivity.class);
intent.putExtra("name",arrayStore.get(position).getName());
intent.putExtra("rarity",arrayStore.get(position).getRarity());
intent.putExtra("item",arrayStore.get(position).getImage());
intent.putExtra("price",arrayStore.get(position).getPrice());
intent.putExtra("key","Store");
context.startActivity(intent);
}
}
private void setColor(@NonNull final StoreAdapter.GameViewHolder viewHolder) {
String rarity = arrayStore.get(viewHolder.getAdapterPosition()).getRarity();
if (rarity.contains("legendary")) {
viewHolder.itemRarity.setImageResource(R.drawable.color_legendary_gradient);
} else if (rarity.contains("classic")) {
viewHolder.itemRarity.setImageResource(R.drawable.color_classic_gradient);
} else if (rarity.contains("epic")) {
viewHolder.itemRarity.setImageResource(R.drawable.color_epic_gradient);
} else if (rarity.contains("elite")) {
viewHolder.itemRarity.setImageResource(R.drawable.color_elite_gradient);
} else if (rarity.contains("rare")) {
viewHolder.itemRarity.setImageResource(R.drawable.color_rare_gradient);
} else if (rarity.contains("special")) {
viewHolder.itemRarity.setImageResource(R.drawable.color_special_gradient);
}
}

我的bean类:

private String image,name,price,rarity;
public Store() {
}
public String getImage() {
return image;
}
public String getName() {
return name;
}
public String getPrice() {
return price;
}
public String getRarity() {
return rarity;
}

推荐阅读
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
author-avatar
小么么和
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有