I have two recycler views in my app both connected to a Database but different collections. First is in MainActivity and gets data from first collection and each item can be clicked and than sent to second collection, that works perfectly but second is in a another Activity and gets data from a second collection but doesn't display anything.
I tested second recycler view doing those things:
This is my code:
Main Activity.java
public class MainActivity extends AppCompatActivity {
RecyclerView items;
public ArrayList<Item> itemsList;
MyAdapter adapter;
FirebaseFirestore db;
ProgressDialog pD;
Button viewAddedButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewAddedButton = findViewById(R.id.addedBtn);
pD = new ProgressDialog(this);
pD.setCancelable(false);
pD.setMessage("Retrieving Data...");
pD.show();
items = findViewById(R.id.recycle);
items.setHasFixedSize(true);
items.setLayoutManager(new LinearLayoutManager(this));
db = FirebaseFirestore.getInstance();
itemsList = new ArrayList<Item>();
adapter = new MyAdapter(MainActivity.this, itemsList, new MyAdapter.ItemClickListener() {
@Override
public void onItemClick(Item item) {
Intent intent = new Intent(MainActivity.this, ItemView.class);
intent.putExtra("Item", item);
startActivity(intent);
}
});
viewAddedButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ItemsAdded.class);
startActivity(intent);
}
});
items.setAdapter(adapter);
EventChangeListener();
}
private void EventChangeListener() {
db.collection("Foods").orderBy("Type")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if (error != null){
Toast.makeText(MainActivity.this, "Database Error " + error.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
for (DocumentChange dc : value.getDocumentChanges()){
if(dc.getType() == DocumentChange.Type.ADDED){
itemsList.add(dc.getDocument().toObject(Item.class));
}
if(pD.isShowing()){
pD.dismiss();
}
adapter.notifyDataSetChanged();
}
}
});
}
}
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
Context context;
ArrayList<Item> list;
private ItemClickListener mItemListener;
public MyAdapter(Context context, ArrayList<Item> list, ItemClickListener itemClickListener )
{
this.context = context;
this.list = list;
this.mItemListener = itemClickListener;
}
@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.cardview, parent, false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
Item item = list.get(position);
holder.Name.setText(item.Name);
holder.Type.setText(item.Type);
holder.Slika.setImageResource(R.drawable.ic_launcher_background);
holder.itemView.setOnClickListener(view -> {
mItemListener.onItemClick(list.get(position));
} );
}
@Override
public int getItemCount() {
return list.size();
}
public interface ItemClickListener{
void onItemClick(Item item);
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView Name, Type;
ImageView Slika;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
Name = itemView.findViewById(R.id.Name);
Type = itemView.findViewById(R.id.Type);
Slika = itemView.findViewById(R.id.Photo);
}
}
}
ItemsAdded.java
public class ItemsAdded extends AppCompatActivity {
RecyclerView recycle;
MyAdapter adapter;
public ArrayList<Item> addedItems;
FirebaseFirestore db;
ProgressDialog pD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items_added);
pD = new ProgressDialog(this);
pD.setCancelable(false);
pD.setMessage("Retrieving Data...");
pD.show();
addedItems = new ArrayList<>();
db = FirebaseFirestore.getInstance();
recycle = findViewById(R.id.addedRecycler);
adapter = new MyAdapter(ItemsAdded.this, addedItems, new MyAdapter.ItemClickListener() {
@Override
public void onItemClick(Item item) {
Intent intent = new Intent(ItemsAdded.this, ItemView.class);
intent.putExtra("Item", item);
startActivity(intent);
}
});
recycle.setAdapter(adapter);
EventChangeListener();
}
private void EventChangeListener() {
db.collection("AddedItems")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if (error != null){
Toast.makeText(ItemsAdded.this, "Database Error " + error.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
for (DocumentChange dc : value.getDocumentChanges()){
if(dc.getType() == DocumentChange.Type.ADDED){
addedItems.add(dc.getDocument().toObject(Item.class));
}
if(pD.isShowing()){
pD.dismiss();
}
adapter.notifyDataSetChanged();
}
}
});
}
}
Items View.java
TextView Name, Type, kcal, uh, prot;
Button addBtn;
ArrayList<Item> savedItemList = new ArrayList<>();
FirebaseFirestore db;
String NameS, TypeS, kcalS, uhS, protS;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item_view);
db = FirebaseFirestore.getInstance();
Name = findViewById(R.id.NameView);
Type = findViewById(R.id.TypeView);
kcal = findViewById(R.id.kcal);
uh = findViewById(R.id.uh);
prot = findViewById(R.id.prot);
addBtn = findViewById(R.id.AddBtn);
Item item = (Item) getIntent().getSerializableExtra("Item");
NameS = item.getName();
TypeS = item.getType();
kcalS = item.getKcal();
uhS = item.getKcal();
protS = item.getProtein();
Name.setText(NameS);
Type.setText(TypeS);
kcal.setText(kcalS);
uh.setText(uhS);
prot.setText(protS);
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ItemView.this, "ADDED " + NameS + "!", Toast.LENGTH_SHORT).show();
Map<String, Object> itemAdded = new HashMap<>();
itemAdded.put("Name", NameS);
itemAdded.put("Type", TypeS);
itemAdded.put("kcal", kcalS);
itemAdded.put("uh", uhS);
itemAdded.put("prot", protS);
db.collection("AddedItems")
.add(itemAdded)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
Toast.makeText(ItemView.this, "Added to database", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(ItemView.this, "Database Error " + e, Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
Logcat prints nothing.
I think it's not error with database because Processdialog that should dissapear only after fetching data dissapears.
Solved it, stupid mistake. just had to add two lines.
public class ItemsAdded extends AppCompatActivity {
RecyclerView recycle;
MyAdapter adapter;
public ArrayList<Item> addedItems;
FirebaseFirestore db;
ProgressDialog pD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items_added);
pD = new ProgressDialog(this);
pD.setCancelable(false);
pD.setMessage("Retrieving Data...");
pD.show();
addedItems = new ArrayList<>();
db = FirebaseFirestore.getInstance();
recycle = findViewById(R.id.addedRecycler);
//added this two lines
recycle.setHasFixedSize(true);
recycle.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyAdapter(ItemsAdded.this, addedItems, new MyAdapter.ItemClickListener() {
@Override
public void onItemClick(Item item) {
Intent intent = new Intent(ItemsAdded.this, ItemView.class);
intent.putExtra("Item", item);
startActivity(intent);
}
});
recycle.setAdapter(adapter);
EventChangeListener();
}
private void EventChangeListener() {
db.collection("AddedItems").orderBy("Type")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if (error != null){
Toast.makeText(ItemsAdded.this, "Database Error " + error.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
for (DocumentChange dc : value.getDocumentChanges()){
if(dc.getType() == DocumentChange.Type.ADDED){
addedItems.add(dc.getDocument().toObject(Item.class));
}
if(pD.isShowing()){
pD.dismiss();
}
adapter.notifyDataSetChanged();
}
}
});
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.