[英]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);
}
}
}
所以我通过将我的“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.