Как получить значения из FireBase в JSONArray? - PullRequest
0 голосов
/ 22 октября 2018

Я получил исходный код приложения доставки еды от 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 голосов
/ 22 октября 2018

stackoverflow не был задуман для получения законченных решений кода.Мы можем помочь вам только в какой-то момент.Кроме этого, вам нужно подумать об использовании класса Food для чтения и записи значений в вашей базе данных.Когда вы извлекаете значения, получите их как объект Food, приведя их к методу dataSnapshot.getValue ("object class"); ...

В вашем случае вам нужен такой код:

@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
}

Если вам нужна помощь, пожалуйста, сообщите нам больше

0 голосов
/ 22 октября 2018

Вы, кажется, загружаете продукты из базы данных и читаете значения из них.Осталось только добавить каждый элемент в массив 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();
    }
});
0 голосов
/ 22 октября 2018

Если вы хотите отобразить строки, полученные от firebase в новом действии, в виде списка, вы можете объявить ArrayList, а затем добавить эти строки в него, а затем с помощью адаптера настроить его на отображение.

В коде это выглядит примерно так:

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) {

            }
        });    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...