Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将firebase数据库中的数据结构为列表<;字符串>;?_Java_Android_Firebase_Arraylist_Firebase Realtime Database - Fatal编程技术网

Java 如何将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数据库中构造数据,以便在查询时返回
列表。我正在实现一个图像滑块,我需要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);