繁体   English   中英

如果项目来自 json 字符串,则 RecyclerView 不会显示它们

[英]RecyclerView won't show Items if they come from json String

我正在创建一个购物清单,并希望通过 Json 字符串将其保存在 Firebase 中。 如果我从 json 字符串中检索我的 ArrayList,它不会在我的 Recyclerview 中显示项目,但如果我创建一个包含项目的虚拟列表,它会显示它们。 两个 ArrayList 看起来都一样,所以我认为适配器不是问题所在。 我只是正确地学习了如何用 C 编程,并且一直在使用 Android Studio 的教程,所以也许我只是在做一些一般性的错误。 这是片段

public class EinkaufslisteFragment extends Fragment {


    public EinkaufslisteFragment() {
        // Required empty public constructor
    }
    private String userID;
    private FirebaseUser user;

    private View myFragmentView;

    private RecyclerView einkaufslisteView;
    private EinkaufslisteAdapter einkaufslisteAdapter;

    private ArrayList<ZutatClass> einkaufsliste;
    private String jsonEinkaufsliste;

    private DatabaseReference mDatabaseRefEinkaufsliste;

    private Spinner einheiten_spinner;
    private EditText editTextZutat;
    private EditText editTextAnzahl;
    private Button buttonAdd;

    private ArrayList<ZutatClass> dummyList;
    private ZutatClass zutat1;
    private ZutatClass zutat2;
    private ZutatClass zutat3;
    private ZutatClass zutat4;
    private ZutatClass zutat5;
    private ZutatClass zutat6;
    private ZutatClass zutat7;
    private ZutatClass zutat8;
    private ZutatClass zutat9;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        myFragmentView = inflater.inflate(R.layout.fragment_einkaufsliste, container, false);

        //User
        user = FirebaseAuth.getInstance().getCurrentUser();
        userID = user.getUid();

        mDatabaseRefEinkaufsliste = FirebaseDatabase.getInstance().getReference(userID + "/einkaufsliste");

        //Liste für Tests erstellen

        zutat1 = new ZutatClass("Zucker", "","EL");
        zutat2 = new ZutatClass("Mehl","500","g");
        zutat3 = new ZutatClass("Wasser","100","ml");
        zutat4 = new ZutatClass("Bananen","4","Stk");
        zutat5 = new ZutatClass("Salz","2","TL");
        zutat6 = new ZutatClass("Backpulver","1","Packung");
        zutat7 = new ZutatClass("Pfeffer","","Priese");
        zutat8 = new ZutatClass("hallo","10","g");
        zutat9 = new ZutatClass("mehr Zucker","20","g");

        dummyList = new ArrayList<ZutatClass>();
        einkaufsliste = new ArrayList<ZutatClass>();

        dummyList.add(zutat1);
        dummyList.add(zutat2);
        dummyList.add(zutat3);
        dummyList.add(zutat4);
        dummyList.add(zutat5);
        dummyList.add(zutat6);
        dummyList.add(zutat7);
        dummyList.add(zutat8);
        dummyList.add(zutat9);
        // dummyListe fertig



        einkaufsliste = new ArrayList<ZutatClass>();

        //Recyclerview
        einkaufslisteView = myFragmentView.findViewById(R.id.recyclerViewEinkaufsliste);
        einkaufslisteView.setHasFixedSize(true);
        einkaufslisteView.setLayoutManager(new LinearLayoutManager(getActivity()));
        einkaufslisteAdapter = new EinkaufslisteAdapter(getActivity(),dummyList);      //works
     // einkaufslisteAdapter = new EinkaufslisteAdapter(getActivity(),einkaufsliste);   // doesn't work...
        einkaufslisteView.setAdapter(einkaufslisteAdapter);



        //implementation
        editTextAnzahl = myFragmentView.findViewById(R.id.einkaufsliste_edittext_zutat);
        editTextZutat = myFragmentView.findViewById(R.id.einkaufsliste_edittext_anzahl);
        buttonAdd = myFragmentView.findViewById(R.id.einkaufsliste_button_add);






        //Spinner
        einheiten_spinner = (Spinner) myFragmentView.findViewById(R.id.einkaufsliste_spinner_einheiten2);

        ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(),
                R.layout.spinner_text,getResources().getStringArray(R.array.einheiten));
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        einheiten_spinner.setAdapter(adapter);


        mDatabaseRefEinkaufsliste.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                einkaufsliste.clear();
                jsonEinkaufsliste = snapshot.getValue(String.class);
                loadEinkaufsliste();

                einkaufslisteAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

        //OnClick
        buttonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO und so
            }
        });
        // Inflate the layout for this fragment
        return myFragmentView;
    }

    private void loadEinkaufsliste() {
        if (jsonEinkaufsliste == null) {
            jsonEinkaufsliste = new String();
        } else {
            Gson gson = new Gson();
            Type type = new TypeToken<ArrayList<ZutatClass>>() {
            }.getType();
            einkaufsliste = gson.fromJson(jsonEinkaufsliste, type);
            if (einkaufsliste == null) {
                einkaufsliste = new ArrayList<>();
            }
        }
    }

以防万一它是适配器,这里是

package com.example.kochapp_firebase;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class EinkaufslisteAdapter extends RecyclerView.Adapter<EinkaufslisteAdapter.EinkaufViewholder> {

    private Context mContext;
    private static ArrayList<ZutatClass> zutatEinkaufsList;

    public EinkaufslisteAdapter(Context context, ArrayList<ZutatClass> einkaufsliste){
        mContext = context;
       zutatEinkaufsList = einkaufsliste;
    }

    @NonNull
    @Override
    public EinkaufViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.einkaufsliste_item, parent, false);
        return new EinkaufslisteAdapter.EinkaufViewholder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull EinkaufViewholder holder, int position) {

        ZutatClass currentZutat = zutatEinkaufsList.get(position);

        String anzahl_Einheit = String.valueOf(zutatEinkaufsList.get(position).getAnzahl_int()) + " "
                + zutatEinkaufsList.get(position).getEinheit();
        holder.txtZutat.setText(currentZutat.getZutat_sting());
        holder.txtAnzahl_Einheit.setText(anzahl_Einheit);

        holder.imgCategorie.setVisibility(View.INVISIBLE); // erstmal nicht sichtbar, bis Kategorien eingefügt wurden


    }

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

    public class EinkaufViewholder extends RecyclerView.ViewHolder {

        CheckBox checkBoxGekauft;
        TextView txtZutat;
        TextView txtAnzahl_Einheit;
        ImageView imgCategorie;

        public EinkaufViewholder(@NonNull View itemView) {
            super(itemView);
            checkBoxGekauft = itemView.findViewById(R.id.einkaufsliste_checkbox);
            txtZutat = itemView.findViewById(R.id.einkaufsliste_zutat);
            txtAnzahl_Einheit = itemView.findViewById(R.id.einkaufsliste_anzahl_u_einheit);
            imgCategorie = itemView.findViewById(R.id.einkaufsliste_img_categorie);
        }
    }
}

DummyList 中的 Item 外观的图片

实际列表中项目的外观图片

所以我通过将我的“einkaufsliste”中的项目添加到 dummyList 来让它工作,现在它可以工作了。 但仍然不确定为什么它首先不起作用。

        mDatabaseRefEinkaufsliste.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                dummyList.clear();
                jsonEinkaufsliste = snapshot.getValue(String.class);
                loadEinkaufsliste();
                for(int n=0;n<=einkaufsliste.size()-1;n++){  // added this for loop
                    dummyList.add(einkaufsliste.get(n));
                }
                einkaufslisteAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM