Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

showing RecyclerView on fragment with data from Firebase

I'm having a problem with making a RecycleView in a fragment with data from Firebase. I expect the app to show the RecycleView after I clicked on a button to change from one fragment to the RecycleView fragment, but it does change the showed fragment but it does not show anything.

I know there are plenty of questions like this but I don't seem to find the correct solution to this problem.

I've made everything needed for a Firebase RecyclerView, and also tried to build it inside an activity instead fragment and it did work, but not with the fragment. I've tried to initialize the adapter and recyclerview inside the onCreateView method, onActivityCreated, and onViewCreated method and none of them seem to be working.

Here's my fragment code:

private KidAdapter adapter;
private RecyclerView recyclerView;

Button button;
View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.uangsaku_menu_fragment, container, false);
    button = view.findViewById(R.id.btn_add);
    button.setOnClickListener(this);

    recyclerView = view.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    setUpRecyclerView();

    return view;
}

@Override
public void onClick(View v) {
    if(v.getId() == R.id.btn_add){
        Intent intent = new Intent(getActivity(), Register.class);
        startActivity(intent);
    }

}

public void setUpRecyclerView(){
    Query query = FirebaseDatabase.getInstance().getReference("kids");

    FirebaseRecyclerOptions<kidData> options = new FirebaseRecyclerOptions.Builder<kidData>()
            .setQuery(query, kidData.class)
            .build();

    adapter = new KidAdapter(options);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(adapter);
}

@Override
public void onStart() {
    super.onStart();
    if (adapter != null) {
        adapter.startListening();
    }

}

@Override
public void onStop() {
    super.onStop();
    if (adapter != null) {
        adapter.stopListening();
    }

}

}

The adapter class

public class KidAdapter extends FirebaseRecyclerAdapter<kidData, KidAdapter.KidViewHolder> {

public KidAdapter(@NonNull FirebaseRecyclerOptions<kidData> options) {
    super(options);
}

@Override
protected void onBindViewHolder(@NonNull KidViewHolder holder, int position, @NonNull kidData model) {
    holder.nama.setText(model.getKidName());
    holder.balance.setText(model.getKidBalance());
    holder.limit.setText("Limit: "+model.getKidLimit());
    holder.spending.setText("Spending xxx.xxx");
}

@NonNull
@Override
public KidViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.kids_card,
            viewGroup, false);
    return new KidViewHolder(v);
}

public class KidViewHolder extends RecyclerView.ViewHolder {

    TextView nama, balance, limit, spending;
    public KidViewHolder(@NonNull View itemView) {
        super(itemView);

        nama = itemView.findViewById(R.id.tv_nama);
        balance = itemView.findViewById(R.id.tv_balance);
        limit = itemView.findViewById(R.id.tv_dailylimit);
        spending = itemView.findViewById(R.id.tv_dailyspending);
    }
}

}

The kidData model class

public class kidData {
String kidName, kidEmail, kidDoB, kidLimit, kidBalance;

public kidData(){

}

public kidData(String kidName, String kidEmail, String kidDoB, String kidLimit, String kidBalance) {
    this.kidName = kidName;
    this.kidEmail = kidEmail;
    this.kidDoB = kidDoB;
    this.kidLimit = kidLimit;
    this.kidBalance = kidBalance;
}

public String getKidName() {
    return kidName;
}

public String getKidEmail() {
    return kidEmail;
}

public String getKidDoB() {
    return kidDoB;
}

public String getKidLimit() {
    return kidLimit;
}

public String getKidBalance() {
    return kidBalance;
}

}

like image 723
Benaya Rio Avatar asked Jan 31 '19 10:01

Benaya Rio


People also ask

How fetch data from Firebase Android and display in RecyclerView?

Step 1: Open Android Studio and create a new project named “RecyclerView” with an empty activity. Step 2: Connect your Firebase project with your app. Step 3: Add the following dependency in your app/build. gradle file in order to get the FirebaseUI and Firebase Realtime Database support in the app.

Can you use a RecyclerView to display data from a database?

With RecyclerView you can display a table of data, display items in a grid or if you want you can also do a Staggered layout as Pinterest does it with every item being a different size. We will show, what you need for a RecyclerView, with a small app that will show a list of cities.

Can we use RecyclerView in fragment?

Set the Adapter to RecyclerView on Fragment class This class will call the layout that consists of the RecyclerView and connect the adapter with the RecyclerView. onViewCreated() will set the RecyclerAdapter to the RecyclerView layout.


1 Answers

The problem in your code is the use of the following line of code:

recyclerView.setHasFixedSize(true);

And this is because when using the latest version of Firebase-UI library, there is no need to set the size of the RecyclerView as fixed. The solution for solving this problem is to simply remove/comment the above line of code. That's it!

like image 57
Alex Mamo Avatar answered Nov 10 '22 00:11

Alex Mamo