Sir George
Sir George

Reputation: 433

Populating a ListView with firebase data in android

I am back with this question again, I am close though: I have the following code which I am trying to show the firebase values in a list view.

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mystatement);
        listview = (ListView) findViewById(R.id.listview);
        textView4 = (TextView) findViewById(R.id.textView4);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
        listview.setAdapter(adapter);
        dref = FirebaseDatabase.getInstance().getReference();


        DatabaseReference dref = FirebaseDatabase.getInstance().getReference();
        dref= dref.child("Expenditure");

        dref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    //Getting the data from snapshot
                    DogExpenditure dogExpenditure = postSnapshot.getValue(DogExpenditure.class);

                    //Adding it to a string
                    String expenses = "Amount: "+dogExpenditure.getAmount()+"\nReason for Use: "+dogExpenditure.getItem()+"\n\n";

                    String amount = dogExpenditure.getAmount();
                    String item = dogExpenditure.getItem();

                    System.out.println(expenses);


                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }


            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
            }
        });

When I run this code, in my android studio console, I see the below output. Which is exactly what I want. But, it is not displaying in my layout view from the app, it shows a blank screen.

**03-07 15:15:05.777 32332-32332/com.example.moses.farm I/System.out: Amount: dd
03-07 15:15:05.779 32332-32332/com.example.moses.farm I/System.out: Reason for Use: dddd
03-07 15:15:05.782 32332-32332/com.example.moses.farm I/System.out: Amount: kwaraaaa
03-07 15:15:05.782 32332-32332/com.example.moses.farm I/System.out: Reason for Use: ayeeeee**

Can someone please show me how to display that output in my app, because currently it is not showing anything but in the debug console I can see it

Upvotes: 2

Views: 9085

Answers (5)

Nitesh Mishra
Nitesh Mishra

Reputation: 574

First create an adapter as you already have the model class. MyAdapter.java

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private Context context;
private List<DogExpenditure> uploads;

public MyAdapter(Context context, List<DogExpenditure> uploads) {
    this.uploads = uploads;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_firebase_images, parent, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    DogExpenditure upload = uploads.get(position);

    holder.textViewName.setText(upload.getAmount());
    holder.textView1.setText(upload.getYourData());

}

@Override
public int getItemCount() {

    return uploads.size();
}

class ViewHolder extends RecyclerView.ViewHolder {

    public TextView textViewName;
    public ImageView imageView;

    public ViewHolder(View itemView) {
        super(itemView);

        textViewName = (TextView) itemView.findViewById(R.id.textViewName);
        textview1 = (TextView) itemView.findViewById(R.id.your_id);
    }
}
 }

Now inside your activity

private List<DogExpenditure> uploads;
MyAdapter adapter;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mystatement);
    listview = (ListView) findViewById(R.id.listview);
    textView4 = (TextView) findViewById(R.id.textView4);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
    listview.setAdapter(adapter);
    dref = FirebaseDatabase.getInstance().getReference();
    uploads = new ArrayList<>();

    DatabaseReference dref = FirebaseDatabase.getInstance().getReference();
    dref= dref.child("Expenditure");

    dref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                //Getting the data from snapshot
                DogExpenditure dogExpenditure = postSnapshot.getValue(DogExpenditure.class);
                uploads.add(dogExpenditure);
            }
            adapter = new MyAdapter(getApplicationContext(), uploads);
            recyclerView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }


        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

Upvotes: 0

Gabriele Mariotti
Gabriele Mariotti

Reputation: 363895

You can use FirebaseUI.

It is very simple to populate the listView with the firebase data.

Just add the dependencies then:

  1. Connect to Firebase
  2. Create custom FirebaseListAdapter subclass

Something like:

  listview = (ListView) findViewById(R.id.listview);
    DatabaseReference dref = FirebaseDatabase.getInstance().getReference();
    mAdapter = new FirebaseListAdapter<DogExpenditure>(this, DogExpenditure.class, R.layout.yourLayout, ref) {
            @Override
            protected void populateView(View view, DogExpenditure myObj, int position) {
               //populate your view
               String amount = dogExpenditure.getAmount()
               //Put the value in your layout.
            }
        };
listview.setAdapter(mAdapter);

More info here.

Upvotes: 2

Janwilx72
Janwilx72

Reputation: 506

//Just above onCreate
List<String> expenseList = new ArrayList<>();
ArrayAdapter<String> adapter;

//In value event listener
expenseList.add(expense)

if(expensList.size() == 1)
{
  adapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,expensList);
  listView.setAdapter(adapter)
}
else if(expenseList.size() > 1)
{
  adapter.notifyDatasetChanged();
}

Upvotes: 0

MarS
MarS

Reputation: 74

You should add your expenses to your list and notify the change using
adapter.notifyDataSetChanged().

list.add(expenses)

adapter.notifyDataSetChanged()

Upvotes: 0

Avani Paneliya
Avani Paneliya

Reputation: 122

make a singleton object of dref.

and list has not been intialized.

Upvotes: 0

Related Questions