ListView の扱いとしては、『Android : Data Binding で ListView へのデータ表示を凄く簡単にする』 の拡張です。 Firebase 部分のセットアップは、『Firebase API + Android Studio : Database 処理の基本設定』を参照して下さい。 Firebase API で Databaseデータ を読み込む方法に関しては『Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。』を参照して下さい Firebase の ArrayList データを使用したソース
public class MainActivity extends Activity { private FirebaseDatabase database; private DatabaseReference mDatabase; private ArrayList<Item> users; private User user; TestArrayAdapter<Item> adapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); database = FirebaseDatabase.getInstance(); mDatabase = database.getReference(); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User(); user.setFirstName("山田"); user.setLastName("タロウ"); binding.setUser(user); adapter = new TestArrayAdapter<Item>( MainActivity.this, R.layout.myitem, new TestArrayAdapter.OnGetViewListener() { @Override public View onGetViewListener(int position, View convertView, ViewGroup parent) { MyitemBinding myitem; if ( convertView == null ) { LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService (Context.LAYOUT_INFLATER_SERVICE); myitem = DataBindingUtil.inflate(inflater, R.layout.myitem, parent, false); } else { myitem = DataBindingUtil.getBinding(convertView); } ListView lv = (ListView)parent; TestArrayAdapter- taa = (TestArrayAdapter
- )lv.getAdapter(); myitem.setItem( taa.getItem(position) ); // ここが重要です return myitem.getRoot(); } } ); ((ListView)MainActivity.this.findViewById(R.id.listView)).setAdapter(adapter); // Firebase Database より読み込み MainActivity.this.findViewById(R.id.buttonFirebase).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDatabase.child("users").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if ( dataSnapshot.exists() ) { Log.i("lightbox", dataSnapshot.getValue().toString()); GenericTypeIndicator<ArrayList<Item>> t = new GenericTypeIndicator<ArrayList<Item>>() {}; users = dataSnapshot.getValue(t); adapter.clear(); adapter.addAll(users); } else { Log.i("lightbox","データを読み込めませんでした"); } } @Override public void onCancelled(DatabaseError databaseError) { Log.i("lightbox","onCancelled"); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); databaseError.toException().printStackTrace(pw); pw.flush(); String stackTrace = sw.toString(); Log.i("lightbox",stackTrace); } }); } }); // ボタンを押して、オブジェクトの変更のみで反映されます MainActivity.this.findViewById(R.id.buttonSetValue).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { user.setFirstName("鈴木"); user.setLastName("ジロウ"); if ( users != null ) { users.get(0).setText("getView での記述が簡単になりました"); users.get(1).setText("しかも、オブジェクトを変更すると ListView も変わります"); } } }); } // バインド用クラス(1) public static class User extends BaseObservable { private String firstName; private String lastName; @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(sample.lightbox.myapplication.BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(sample.lightbox.myapplication.BR.lastName); } } // バインド用クラス(2) : ListView 用 public static class Item extends BaseObservable { private String title; private String text; private boolean flg = false; public Item() {} public Item(String text,String title) { this.text = text; this.title = title; } @Bindable public String getText() { return this.text; } @Bindable public String getTitle() { return this.title; } public void setText(String text) { this.text = text; notifyPropertyChanged(sample.lightbox.myapplication.BR.text); } public void seTitle(String title) { this.title = title; notifyPropertyChanged(sample.lightbox.myapplication.BR.title); } public String getCode() { return title; } public String getName() { return text; } public void setCode(String code) { this.title = code; } public void setName(String name) { this.text = name; } } }
Item クラスに、Firebase で定義したデータを使用する為に、Firebase 用の Setter を作成して、元々のデータ処理と互換性を持たせています。 setText と setTitle 側で、notifyPropertyChanged を使っているので、そちらでデータの変更を行っています。 このデータは、以下のようなフォーマットであり、ArrayList として直接取得しています。 しかし、個別のデータとしては上記データは特殊な部類になるので、以下のようなデータで ListView にデータをセットします。 Firebase の HashMap データを使用したソース
public class MainActivity extends Activity { private FirebaseDatabase database; private DatabaseReference mDatabase; private HashMap<String,Item> users; private ArrayList<Item> userList; private User user; TestArrayAdapter<Item> adapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); database = FirebaseDatabase.getInstance(); mDatabase = database.getReference(); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User(); user.setFirstName("山田"); user.setLastName("タロウ"); binding.setUser(user); adapter = new TestArrayAdapter<Item>( MainActivity.this, R.layout.myitem, new TestArrayAdapter.OnGetViewListener() { @Override public View onGetViewListener(int position, View convertView, ViewGroup parent) { MyitemBinding myitem; if ( convertView == null ) { LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService (Context.LAYOUT_INFLATER_SERVICE); myitem = DataBindingUtil.inflate(inflater, R.layout.myitem, parent, false); } else { myitem = DataBindingUtil.getBinding(convertView); } ListView lv = (ListView)parent; TestArrayAdapter- taa = (TestArrayAdapter
- )lv.getAdapter(); myitem.setItem( taa.getItem(position) ); // ここが重要です return myitem.getRoot(); } } ); ((ListView)MainActivity.this.findViewById(R.id.listView)).setAdapter(adapter); // Firebase Database より読み込み MainActivity.this.findViewById(R.id.buttonFirebase).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDatabase.child("class").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if ( dataSnapshot.exists() ) { Log.i("lightbox", dataSnapshot.getValue().toString()); GenericTypeIndicator<HashMap<String,Item>> t = new GenericTypeIndicator<HashMap<String,Item>>() {}; users = dataSnapshot.getValue(t); // 必要ならば、ここでデータ順序の変更が必要です userList = new ArrayList<Item>(users.values()); adapter.clear(); adapter.addAll(userList); } else { Log.i("lightbox","データを読み込めませんでした"); } } @Override public void onCancelled(DatabaseError databaseError) { Log.i("lightbox","onCancelled"); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); databaseError.toException().printStackTrace(pw); pw.flush(); String stackTrace = sw.toString(); Log.i("lightbox",stackTrace); } }); } }); // ボタンを押して、オブジェクトの変更のみで反映されます MainActivity.this.findViewById(R.id.buttonSetValue).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { user.setFirstName("鈴木"); user.setLastName("ジロウ"); if ( userList != null ) { userList.get(0).setText("getView での記述が簡単になりました"); userList.get(1).setText("しかも、オブジェクトを変更すると ListView も変わります"); } } }); } // バインド用クラス(1) public static class User extends BaseObservable { private String firstName; private String lastName; @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(sample.lightbox.myapplication.BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(sample.lightbox.myapplication.BR.lastName); } } // バインド用クラス(2) : ListView 用 public static class Item extends BaseObservable { private String title; private String text; private boolean flg = false; public Item() {} public Item(String text,String title) { this.text = text; this.title = title; } @Bindable public String getText() { return this.text; } @Bindable public String getTitle() { return this.title; } public void setText(String text) { this.text = text; notifyPropertyChanged(sample.lightbox.myapplication.BR.text); } public void seTitle(String title) { this.title = title; notifyPropertyChanged(sample.lightbox.myapplication.BR.title); } public String getCode() { return title; } public String getName() { return text; } public void setCode(String code) { this.title = code; } public void setName(String name) { this.text = name; } } }
|
【2016 Android Studioの最新記事】
- Android Studio で Twitter4J で ListView に検索結果を表示する
- Android Studio で Twitter4J で画像付きツイート
- 内部ストレージを起点とした画像データの処理 / Android
- カメラを起点とした画像データの処理 / Android
- バグ : Android Studio 2.2.2 で、spinnerMode を dialog に設定すると app:spinnerMode となってしまいます
- ListView + カスタム ArrayAdapter + ViewSwitcher + Firebase API + Data Binding : 更新処理 / Android Studio
- Firebase storage に画像をアップロードする。1) ギャラリーから、2) 実行中の画面 / Android
- Android : 画像関連のテスト用カメラアプリ
- Firebase storage の画像を ファイルとしてダウンロードして ギャラリーに保存する( ImageView にも表示する ) / Android
- Firebase storage の画像の URL を取得して、通常と同様に Stream でダウンロードして ImageView に表示する / Android
- Firebase storage の画像をメモリに直接ダウンロードして ImageView に表示する / Android
- Android : Firebase の データを REST API の PUT コマンドで更新する
- Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。(orderByChild 使う場合は、getChildren ..
- Firebase API + Android Studio : Database 処理の基本設定
- Android Studio 2.2 で新規プロジェクトを作成すると『Could not reserve enough space for 1572864KB object heap』というエラーが出..
- Firebase API + Android Studio : Database にデータを保存は単純で、DatabaseReference の setValue メソッドを使用します