Java 如何将firebase数据库中的数据结构为列表<;字符串>;?
我想知道如何在Firebase数据库中构造数据,以便在查询时返回Java 如何将firebase数据库中的数据结构为列表<;字符串>;?,java,android,firebase,arraylist,firebase-realtime-database,Java,Android,Firebase,Arraylist,Firebase Realtime Database,我想知道如何在Firebase数据库中构造数据,以便在查询时返回列表。我正在实现一个图像滑块,我需要Firebase返回一个列表,其中包含实现Parcelable的模型类可以解析的图像url 这是我的模型课 public class Property implements Parcelable { private int price; private String address; private int numberOfBed; private int numberOfBath; privat
列表。我正在实现一个图像滑块,我需要Firebase返回一个列表,其中包含实现Parcelable的模型类可以解析的图像url
这是我的模型课
public class Property implements Parcelable {
private int price;
private String address;
private int numberOfBed;
private int numberOfBath;
private int numberOfCar;
private List<String> propertyImage= new ArrayList<>();
private float lotDim;
public Property() { } //Needed for Firebase's auto data mapping
public Property(int price, String address, int numberOfBed, int numberOfBath,
int numberOfCar, List<String> propertyImage, float lotDim) {
this.price = price;
this.address = address;
this.numberOfBed = numberOfBed;
this.numberOfBath = numberOfBath;
this.numberOfCar = numberOfCar;
this.propertyImage = propertyImage;
this.lotDim = lotDim;
}
protected Property(Parcel in) {
price = in.readInt();
address = in.readString();
numberOfBed=in.readInt();
numberOfBath = in.readInt();
numberOfCar = in.readInt();
in.readStringList(propertyImage);
lotDim = in.readFloat();
}
public static final Creator<Property> CREATOR = new Creator<Property>() {
@Override
public Property createFromParcel(Parcel in) {
return new Property(in);
}
@Override
public Property[] newArray(int i) {
return new Property[i];
}
};
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNumberOfBed() {
return numberOfBed;
}
public void setNumberOfBed(int numberOfBed) {
this.numberOfBed = numberOfBed;
}
public int getNumberOfBath() {
return numberOfBath;
}
public void setNumberOfBath(int numberOfBath) {
this.numberOfBath = numberOfBath;
}
public int getNumberOfCar() {
return numberOfCar;
}
public void setNumberOfCar(int numberOfCar) {
this.numberOfCar = numberOfCar;
}
public List<String> getPropertyImage() {
return propertyImage;
}
public void setPropertyImage(List<String> propertyImage) {
this.propertyImage = propertyImage;
}
public float getLotDim() {
return lotDim;
}
public void setLotDim(float lotDim) {
this.lotDim = lotDim;
}
@Override
public int describeContents(){
return 0;
}
@Override
public void writeToParcel( Parcel dest, int flags){
dest.writeInt(price);
dest.writeString(address);
dest.writeInt(numberOfBed);
dest.writeInt(numberOfBath);
dest.writeInt(numberOfCar);
dest.writeStringList(propertyImage);
dest.writeFloat(lotDim);
}
公共类属性实现可包裹{
私人int价格;
私有字符串地址;
私家床;
私人国际浴室;
私家车;
private List propertyImage=new ArrayList();
私有浮动lotDim;
Firebase的自动数据映射需要公共属性()
公共财产(int价格、字符串地址、int numberOfBed、int numberOfBath、,
int numberOfCar,List propertyImage,float lotDim){
这个价格=价格;
this.address=地址;
this.numberOfBed=numberOfBed;
this.numberOfBath=numberOfBath;
this.numberOfCar=numberOfCar;
this.propertyImage=propertyImage;
this.lotDim=lotDim;
}
受保护财产(地块位于){
price=in.readInt();
地址=in.readString();
numberOfBed=in.readInt();
numberOfBath=in.readInt();
numberOfCar=in.readInt();
in.readStringList(propertyImage);
lotDim=in.readFloat();
}
公共静态最终创建者=新创建者(){
@凌驾
公共属性createFromParcel(地块位于){
归还新的财产(以书面形式);
}
@凌驾
公共属性[]新数组(int i){
归还新财产[i];
}
};
public int getPrice(){
退货价格;
}
公共无效设置价格(整数价格){
这个价格=价格;
}
公共字符串getAddress(){
回信地址;
}
公共无效设置地址(字符串地址){
this.address=地址;
}
public int getNumberOfBed(){
返回床号;
}
公共无效设置numberOfBed(int numberOfBed){
this.numberOfBed=numberOfBed;
}
public int getNumberOfBath(){
返回号码;
}
公共无效setNumberOfBath(int numberOfBath){
this.numberOfBath=numberOfBath;
}
public int getNumberOfCar(){
返回车号;
}
公共无效设置numberOfCar(int numberOfCar){
this.numberOfCar=numberOfCar;
}
公共列表getPropertyImage(){
返回属性图像;
}
public void setPropertyImage(列出propertyImage){
this.propertyImage=propertyImage;
}
公共浮点getLotDim(){
返回lotDim;
}
公共void setLotDim(float lotDim){
this.lotDim=lotDim;
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的写入(价格);
目的地记录(地址);
目的地记录(床号);
目的地记录(编号);
目的地记录(车辆编号);
目标writeStringList(propertyImage);
目的写入流(lotDim);
}
}
这是我目前的Firebase结构。它实际上返回一个字符串。我希望它返回一个propertyImage列表。
这是将使用模型类的片段,这是我需要实现代码的地方。请注意,在底部,我做了一些工作,在firebase数据库中,我将所有url附加在一个字符串中(这是一个肮脏的解决方案),并将url拆分为一个数组。:-)
那么如何实现@Alex Mano提供的新代码。谢谢各位
package com.realty.drake.kunuk;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.text.NumberFormat;
import java.util.Locale;
/**
* Created by drake on 4/11/18
*/
public class Tab1Buy extends Fragment {
private DatabaseReference propertyRef;
private RecyclerView mPropertyRecyclerView;
FirebaseRecyclerAdapter<Property, PropertyViewHolder> mPropertyAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.property_tab, container, false);
mPropertyRecyclerView = rootView.findViewById(R.id.property_recyclerView);
return rootView;
}
//TODO Check internet and display error msg if internet down
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mPropertyRecyclerView.hasFixedSize();
mPropertyRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
final ProgressBar progressBar = view.findViewById(R.id.progressBar);
progressBar.setVisibility(View.VISIBLE);
propertyRef = FirebaseDatabase.getInstance()
.getReference()
.child("Buy");
propertyRef.keepSynced(true);
// keyQuery - the Firebase location containing the list of keys to be found in dataRef
//Query personQuery = personRef.orderByKey();
FirebaseRecyclerOptions<Property> options =
new FirebaseRecyclerOptions.Builder<Property>()
.setQuery(propertyRef, Property.class)
.build();
mPropertyAdapter = new FirebaseRecyclerAdapter<Property, PropertyViewHolder>(options) {
@Override
// Bind the Property object to the ViewHolder PropertyHolder
public void onBindViewHolder(@NonNull PropertyViewHolder holder,
final int position, @NonNull final Property model) {
holder.setPrice(model.getPrice());
holder.setAddress(model.getAddress());
holder.setNumberOfBed(model.getNumberOfBed());
holder.setNumberOfBath(model.getNumberOfBath());
holder.setNumberOfCar(model.getNumberOfCar());
holder.setPropertyImage(model.getPropertyImage());
//Intent send Parcelable to PropertyDetail
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().startActivity(new Intent(getActivity(), PropertyDetail.class)
.putExtra("Property", model));
}
});
}
@Override
public PropertyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new instance of the ViewHolder, in this case we are using a custom
// layout called R.layout.property_card for each item
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.property_card, parent, false);
return new PropertyViewHolder(view);
}
@Override
public void onDataChanged() {
// Called each time there is a new data snapshot. You may want to use this method
// to hide a loading spinner or check for the "no documents" state and update your UI.
// ...
progressBar.setVisibility(View.GONE);
}
//TODO Implement onError
@Override
public void onError(@NonNull DatabaseError e) {
// Called when there is an error getting data. You may want to update
// your UI to display an error message to the user.
// ...
progressBar.setVisibility(View.GONE);
Toast.makeText(getActivity(), "DatabaseError", Toast.LENGTH_SHORT).show();
}
};
mPropertyRecyclerView.setAdapter(mPropertyAdapter);
}
@Override
public void onStart() {
super.onStart();
mPropertyAdapter.startListening();
}
@Override
public void onStop() {
super.onStop();
mPropertyAdapter.stopListening();
}
public class PropertyViewHolder extends RecyclerView.ViewHolder {
View mView;
public PropertyViewHolder(View itemView) {
super(itemView);
mView = itemView;
}
public void setPrice(int price) {
String currencyPrice = NumberFormat //Format the price variable in currency form
.getCurrencyInstance(Locale.US)
.format(price);
TextView Price = mView.findViewById(R.id.post_price);
Price.setText(currencyPrice);
}
public void setAddress(String address){
TextView Address = mView.findViewById(R.id.post_address);
Address.setText(String.valueOf(address));
}
public void setNumberOfBed(int numberOfBed){
TextView NumberOfBed = mView.findViewById(R.id.post_bedroom);
NumberOfBed.setText(String.valueOf(numberOfBed));
}
public void setNumberOfBath(int numberOfBath){
TextView NumberOfBath = mView.findViewById(R.id.post_bathroom);
NumberOfBath.setText(String.valueOf(numberOfBath));
}
public void setNumberOfCar(int numberOfCar) {
TextView NumberOfCar = mView.findViewById(R.id.post_garage);
NumberOfCar.setText(String.valueOf(numberOfCar));
}
public void setPropertyImage(String propertyImage){
ImageView imageView = mView.findViewById(R.id.post_propertyImage);
//take one long string containing multiple url in and parse it
String propertyImageArray[] = propertyImage.split(",");
//TODO add loading icon for placeholder
// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(getContext())
.load(propertyImageArray[0])
.fitCenter()
.into(imageView);
}
}
}
package com.realty.drake.kunuk;
导入android.content.Intent;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.support.v4.app.Fragment;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.ProgressBar;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.firebase.ui.database.FirebaseRecyclerAdapter;
导入com.firebase.ui.database.FirebaseRecyclerOptions;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入java.text.NumberFormat;
导入java.util.Locale;
/**
*德雷克于2018年4月11日创作
*/
公共类Tab1Buy扩展片段{
私有数据库引用propertyRef;
私人回收视图MPropertyRecyclView;
FirebaseRecyclerAdapter mPropertyAdapter;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.property_选项卡,容器,false);
mPropertyRecyclerView=rootView.findviewbyd(R.id.property\u recyclerView);
返回rootView;
}
//TODO检查internet并在internet关闭时显示错误消息
@凌驾
已创建公用void onviewCreate(最终视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
mPropertyRecyclerView.hasFixedSize();
setLayoutManager(新的LinearLayoutManager(getActivity());
最终ProgressBar ProgressBar=view.findViewById(R.id.ProgressBar);
progressBar.setVisibility(View.VISIBLE);
propertyRef=FirebaseDatabase.getInstance()
.getReference()
.儿童(“购买”);
propertyRef.keepSynced(true);
//keyQuery-Firebase位置,包含要在dataRef中找到的密钥列表
//Query personQuery=personRef.orderByKey();
FirebaseRecyclerOptions选项=
新的FirebaseRecyclerOptions.Builder()
.setQuery(propertyRef,Property.class)
.build();
MPPropertyAdapter=新的FirebaseRecyclerAdapter(选项){
@凌驾
//将Property对象绑定到ViewHolder PropertyHolder
BindViewHolder上的公共无效(@NonNull PropertyViewHolder,
最终整型位置,@NonNull最终属性模型){
holder.setPrice(model.getPrice());
保持器组
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference propertyImageRef = rootRef.child("Buy").child("1").child("propertyImage");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String url = ds.getValue(String.class);
Log.d("TAG", url);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
propertyImageRef.addListenerForSingleValueEvent(valueEventListener);