Back to project page passby.
The source code is released under:
Copyright 2014 Firebase, https://www.firebase.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ?Software??...
If you think the Android project passby listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
//#CSIT6000B# Rio He 20227977 yheas@connect.ust.hk //#CSIT6000B# Cedric Liang 20220395 zliangag@connect.ust.hk //#CSIT6000B# Kevin Wang 20225577 zwangbo@connect.ust.hk package com.firebase.androidchat; /* w w w . j a v a2 s . c o m*/ import android.app.Activity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.firebase.client.ChildEventListener; import com.firebase.client.DataSnapshot; import com.firebase.client.Query; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class FirebaseListAdapter<T> extends BaseAdapter { private Query ref; private Class<T> modelClass; private int layout; private LayoutInflater inflater; private List<T> models; private Map<String, T> modelNames; private ChildEventListener listener; public FirebaseListAdapter(Query ref, Class<T> modelClass, int layout, Activity activity) { this.ref = ref; this.modelClass = modelClass; this.layout = layout; inflater = activity.getLayoutInflater(); models = new ArrayList<T>(); modelNames = new HashMap<String, T>(); // Look for all child events. We will then map them to our own internal ArrayList, which backs ListView listener = this.ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { T model = dataSnapshot.getValue(FirebaseListAdapter.this.modelClass); modelNames.put(dataSnapshot.getName(), model); // Insert into the correct location, based on previousChildName if (previousChildName == null) { models.add(0, model); } else { T previousModel = modelNames.get(previousChildName); int previousIndex = models.indexOf(previousModel); int nextIndex = previousIndex + 1; if (nextIndex == models.size()) { models.add(model); } else { models.add(nextIndex, model); } } notifyDataSetChanged(); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { // One of the models changed. Replace it in our list and name mapping String modelName = dataSnapshot.getName(); T oldModel = modelNames.get(modelName); T newModel = dataSnapshot.getValue(FirebaseListAdapter.this.modelClass); int index = models.indexOf(oldModel); models.set(index, newModel); modelNames.put(modelName, newModel); notifyDataSetChanged(); } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { // A model was removed from the list. Remove it from our list and the name mapping String modelName = dataSnapshot.getName(); T oldModel = modelNames.get(modelName); models.remove(oldModel); modelNames.remove(modelName); notifyDataSetChanged(); } @Override public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { // A model changed position in the list. Update our list accordingly String modelName = dataSnapshot.getName(); T oldModel = modelNames.get(modelName); T newModel = dataSnapshot.getValue(FirebaseListAdapter.this.modelClass); int index = models.indexOf(oldModel); models.remove(index); if (previousChildName == null) { models.add(0, newModel); } else { T previousModel = modelNames.get(previousChildName); int previousIndex = models.indexOf(previousModel); int nextIndex = previousIndex + 1; if (nextIndex == models.size()) { models.add(newModel); } else { models.add(nextIndex, newModel); } } notifyDataSetChanged(); } @Override public void onCancelled() { Log.e("FirebaseListAdapter", "Listen was cancelled, no more updates will occur"); } }); } public void cleanup() { // We're being destroyed, let go of our listener and forget about all of the models ref.removeEventListener(listener); models.clear(); modelNames.clear(); } @Override public int getCount() { return models.size(); } @Override public Object getItem(int i) { return models.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(layout, viewGroup, false); } T model = models.get(i); // Call out to subclass to marshall this model into the provided view populateView(view, model); return view; } protected abstract void populateView(View v, T model); }