0

I am a newbie in Android Studio and I having some problem in Firebase Recycler Adapter. I got different database in Firebase and it follow to the user ID which is eBay(Example) and Kog. I want to work like if eBay having item, it will shows and else if Kog having item, it shows too. But in the code, I only declare adapter in if...else statement. This make onStart and onStop could not listening. Here is the code. Thanks all of you...

public RecyclerView recyclerView;
public RecyclerView.LayoutManager layoutManager;
FirebaseDatabase database;
DatabaseReference requests;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_order_history);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    database = FirebaseDatabase.getInstance();
    requests = database.getReference("Users");
    recyclerView = (RecyclerView)findViewById(R.id.order_history);

    layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setHasFixedSize(true);

    loadOrders(common.currentUser.getUid());

}

private void loadOrders(String uid) {

    DatabaseReference historyRef = FirebaseDatabase.getInstance().getReference("Users/orderHistory");
    historyRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (snapshot.hasChild("eBay")) {

                FirebaseRecyclerAdapter<ebay_Order, orderViewHolder> adapter;
                FirebaseRecyclerOptions<ebay_Order> options = new FirebaseRecyclerOptions.Builder<ebay_Order>()
                        .setQuery(requests.child(uid).child("eBay"), ebay_Order.class).build();

                adapter = new FirebaseRecyclerAdapter<ebay_Order, orderViewHolder>(options) {

                    @Override
                    protected void onBindViewHolder(@NonNull orderViewHolder holder, int position, @NonNull ebay_Order model) {

                        holder.txtOrderName.setText(model.getEbayId());
                        holder.txtOrderAmount.setText(model.getEbayAmount());
                        holder.txtOrderServices.setText(model.getOrderChoice());

                    }

                    @NonNull
                    @Override
                    public orderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

                        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_history, parent, false);
                        return new orderViewHolder(view);

                    }
                };

                recyclerView.setAdapter(adapter);

            }
            if (snapshot.hasChild("KOG")){
                FirebaseRecyclerAdapter<kog_Order, orderViewHolder> adapter;
                FirebaseRecyclerOptions<kog_Order> options = new FirebaseRecyclerOptions.Builder<kog_Order>()
                        .setQuery(requests.child(uid).child("KOG"), kog_Order.class).build();

                adapter = new FirebaseRecyclerAdapter<kog_Order, orderViewHolder>(options) {

                    @Override
                    protected void onBindViewHolder(@NonNull orderViewHolder holder, int position, @NonNull kog_Order model) {

                        holder.txtOrderName.setText(model.getKogUsername());
                        holder.txtOrderAmount.setText(model.getKogAmounts());
                        holder.txtOrderServices.setText(model.getOrderChoice());

                    }

                    @NonNull
                    @Override
                    public orderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

                        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_history, parent, false);
                        return new orderViewHolder(view);

                    }
                };

                recyclerView.setAdapter(adapter);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }

    });
}

@Override
protected void onStart() {

    super.onStart();
    adapter.startListening();

}

@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}

@Override
public void onBackPressed(){

    Intent intent = new Intent(this, InterPayMain.class);
    orderHistory.this.finish();
    startActivity(intent);

}

And the code for order View Holder

public class orderViewHolder extends RecyclerView.ViewHolder {

public TextView txtOrderName, txtOrderAmount, txtOrderServices;
public LinearLayout root;

public orderViewHolder(@NonNull View itemView) {
    super(itemView);

    root = itemView.findViewById(R.id.list_root);

    txtOrderName = itemView.findViewById(R.id.order_id);
    txtOrderAmount = itemView.findViewById(R.id.order_amount);
    txtOrderServices = itemView.findViewById(R.id.order_choice);
}

And the error is error: cannot find symbol adapter.startListening();

Is that got anyway to declare adapter in begining and able to work for different class.

1 Answers1

0

As mentioned in the answer to this question: How to set two adapters to one RecyclerView?, a single RecyclerView can have only one adapter. You can create an adapter that has two different ViewHolders and chooses between them via overriding getItemViewType - see the question I linked for more information on implementing that solution.

An alternative is to have two separate RecyclerViews: one for each of your lists (eBay and Kog).

Rachel
  • 1