简体   繁体   中英

Android Studio RecyclerView does not show items

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:

  1. Changed it to use first collection
  2. Made a new Adapter
  3. Manually adding items in list of items

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.

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