如何从FireBase检索值到JSONArray?

时间:2018-10-22 08:51:14

标签: android firebase firebase-realtime-database

我从git获得了一个送餐应用程序的源代码。他正在解析一个网站并显示菜单项,我想看到了

screenshot of website

相反,我创建了一个火源数据库并存储了一个食品进行测试

screenshot of fire-base

我想将物品从火源展示到应用程序菜单,我将显示所有食品片段的代码,

package com.example.guanzhuli.foody.HomePage.fragment;

public class AllTabFragment extends Fragment {

    private String baseUrl = "http://rjtmobile.com/ansari/fos/fosapp/fos_food_loc.php?city=";
    private String TAG = "ALLFOOD";
    private StorageReference mStorageRef;

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("menu");

    ArrayList<Food> foods = new ArrayList<>();

    private RecyclerView mRecyclerView;
    private AllFoodAdapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    String foodName;

    public AllTabFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_all_tab, container, false);

        mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                    foodName = snapshot.child("name").getValue().toString();

                    String foodPrice = snapshot.child("prize").getValue().toString();

                    Toast.makeText(getActivity(), foodName, Toast.LENGTH_SHORT).show();

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        // Request Data From Web Service
        if (foods.size() == 0) {
            objRequestMethod();
        }

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview_all);
        mRecyclerView.setHasFixedSize(false);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        adapter = new AllFoodAdapter(getActivity(), foods);

        adapter.setOnItemClickListener(new AllFoodAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view, String data) {
                Bundle itemInfo = new Bundle();
                for (int i = 0; i < foods.size(); i++) {
                    if (foods.get(i).getId() == Integer.valueOf(data)) {
                        itemInfo.putInt("foodId", foods.get(i).getId());
                        itemInfo.putString("foodName", foods.get(i).getName());

                        // itemInfo.putString("foodName", foodName);
                        itemInfo.putString("foodCat", foods.get(i).getCategory());
                        itemInfo.putString("foodRec", foods.get(i).getRecepiee());
                        itemInfo.putDouble("foodPrice", foods.get(i).getPrice());
                        itemInfo.putString("foodImage", foods.get(i).getImageUrl());
                        break;
                    }

                }
                FoodDetailFragment foodDetailFragment = new FoodDetailFragment();
                foodDetailFragment.setArguments(itemInfo);
                getActivity().getSupportFragmentManager()
                        .beginTransaction()
                        .setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out)
                        .replace(R.id.main_fragment_container, foodDetailFragment)
                        .addToBackStack(AllTabFragment.class.getName())
                        .commit();
            }
        });
        mRecyclerView.setAdapter(adapter);
        return view;
    }

    private void objRequestMethod() {
        HomePageActivity.showPDialog();

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, buildUrl(), null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Log.d(TAG, jsonObject.toString());

                try {
                    JSONArray foodsJsonArr = jsonObject.getJSONArray("Food");
                    for (int i = 0; i < foodsJsonArr.length(); i++) {
                        JSONObject c = foodsJsonArr.getJSONObject(i);
                        String id = c.getString("FoodId");
                        String name = c.getString("FoodName");
                        String recepiee = c.getString("FoodRecepiee");
                        String price = c.getString("FoodPrice");
                        String category = c.getString("FoodCategory");
                        String thumb = c.getString("FoodThumb");
                        final Food curFood = new Food();
                        curFood.setCategory(category);
                        curFood.setName(name);
                        curFood.setRecepiee(recepiee);
                        curFood.setPrice(Double.valueOf(price));
                        curFood.setId(Integer.valueOf(id));
                        curFood.setImageUrl(thumb);

                        foods.add(curFood);
                        //                        Log.e("Current Food", curFood.getName());

                        ImageLoader imageLoader = VolleyController.getInstance().getImageLoader();
                        imageLoader.get(thumb, new ImageLoader.ImageListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.e(TAG, "Image Load Error: " + error.getMessage());
                            }

                            @Override
                            public void onResponse(ImageLoader.ImageContainer response, boolean arg1) {
                                if (response.getBitmap() != null) {
                                    curFood.setImage(response.getBitmap());
                                    //                                    Log.e("SET IMAGE", curFood.getName());
                                    adapter.notifyData(foods);
                                }
                            }
                        });
                        foods.get(i).setImage(curFood.getImage());
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }

                HomePageActivity.disPDialog();
            }
        },
                new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                VolleyLog.d(TAG, "ERROR" + volleyError.getMessage());
                Toast.makeText(getActivity(), volleyError.getMessage(),
                        Toast.LENGTH_SHORT).show();
                HomePageActivity.disPDialog();
            }
        });
        VolleyController.getInstance().addToRequestQueue(jsonObjReq);
    }

    private String buildUrl() {
        return baseUrl + HomePageActivity.City;
    }

}

我从火场中获得了食物名称,并存储在名为“ foodname”的字符串中。现在,我想在菜单中显示它,该怎么办? 如果我的问题是错的,请原谅我,请帮助我

package com.example.guanzhuli.foody.HomePage.adapter;

public class AllFoodAdapter extends RecyclerView.Adapter<AllHolder> implements
        View.OnClickListener {

    private Context mContext;
    ArrayList<Food> foods;
    public String TAG = "ALLFOOD";

    //
    //    public AllFoodAdapter(Context context) {
    //        mContext = context;
    //    }
    public AllFoodAdapter(Context context, ArrayList<Food> foods) {
        mContext = context;
        this.foods = foods;
    }

    @Override
    public AllHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.cardview_food, parent, false);
        AllHolder allHolder = new AllHolder(v);
        v.setOnClickListener(this);
        return allHolder;
    }

    @Override
    public void onBindViewHolder(AllHolder holder, int position) {
        holder.mTextId.setText(String.valueOf(foods.get(position).getId()));
        holder.mTextName.setText(foods.get(position).getName());
        holder.mTextPrice.setText(String.valueOf(foods.get(position).getPrice()));
        holder.mTextCategory.setText(foods.get(position).getCategory());
        holder.mImageView.setImageBitmap(foods.get(position).getImage());

        holder.itemView.setTag(foods.get(position).getId());
    }

    @Override
    public int getItemCount() {
        return foods.size();
    }

    public void notifyData(ArrayList<Food> foods) {
        //        Log.d("notifyData ", foods.size() + "");
        this.foods = foods;
        notifyDataSetChanged();
    }

    public static interface OnRecyclerViewItemClickListener {

        void onItemClick(View view, String data);
    }

    private OnRecyclerViewItemClickListener mOnItemClickListener = null;

    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }

    @Override
    public void onClick(View view) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(view, String.valueOf(view.getTag()));
        } else {
            Log.e("CLICK", "ERROR");
        }
    }
}

class AllHolder extends RecyclerView.ViewHolder {

    NetworkImageView mImage;
    ImageView mImageView;
    TextView mTextId, mTextName, mTextCategory, mTextPrice;

    public AllHolder(View itemView) {
        super(itemView);
        // mImage = (NetworkImageView) itemView.findViewById(R.id.food_img);
        mImageView = (ImageView) itemView.findViewById(R.id.food_img);
        mTextId = (TextView) itemView.findViewById(R.id.food_id);
        mTextName = (TextView) itemView.findViewById(R.id.food_name);
        mTextPrice = (TextView) itemView.findViewById(R.id.food_price);
        mTextId = (TextView) itemView.findViewById(R.id.food_id);
        mTextCategory = (TextView) itemView.findViewById(R.id.food_category);
    }
}

请帮助我,因为这对我来说是一个重要的项目

3 个答案:

答案 0 :(得分:1)

如果要在新活动中将从Firebase接收到的字符串显示为列表,可以声明ArrayList,然后将这些字符串添加到其中,然后将适配器设置为显示。 / p>

在代码中看起来像这样:

private ArrayList array;
    private ListView listView;
    private FirebaseAuth mAuth = FirebaseAuth.getInstance();
    private String curName;

    //set them 

    listView = findViewById(R.id.list1);
    array = new ArrayList<String>();

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("menu");    

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    array.add(ds.child("name").getValue(String.class));

                }


                ArrayAdapter adapter = new ArrayAdapter(Main6Activity.this, android.R.layout.simple_list_item_1, array);
                listView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });    

答案 1 :(得分:0)

stackoverflow并非旨在获得完整的代码解决方案。我们只能在某些方面为您提供帮助。除此之外,您需要考虑使用Food类在您的数据库上读写值。检索值时,可以通过方法 dataSnapshot.getValue(“ object class”); ...

将其作为将其转换为食物的Food对象来获取

在您的情况下,您需要这样的代码:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
        Food food = snapshot.getValue(Food.class);
        //here you need to add the food object to a list and after the for diplay it with adapter.
       //for example foodsList.add(food);
    }
    foodsList.setAdapter(myAdepter); //ecc
}

如果您需要帮助,请告诉我们更多

答案 2 :(得分:0)

您似乎正在从数据库中加载食品,并从中读取值。剩下要做的就是将每个项目添加到foods数组中,并告诉适配器其数据已更改:

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            String foodName = snapshot.child("name").getValue(String.class);
            String foodPrice = snapshot.child("prize").getValue(String.class);

            Food food = new Food();
            food.setName(name);
            food.setPrice(Double.valueOf(price));
            foods.add(food);
        }

        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});