Firebase の環境とプロジェクトの作成方法 ▼ 表示 / 更新用の Firebase URL https://freebase-654b7.firebaseio.com/class.json![]()
▼ 構成
インターネットデータの読み込みと メッセージボックスの処理は、tools.jar を使用しています。 Firebase における REST API どうも、単純読み出しと更新しか現時点(2016/10/17)では、あてにならないようです。少なくとも、以前のバージョンではソートができていたはずなのですが、現在正しく動きません。というか、そもそも現在の最新ドキュメントに何も書いてくれていません。なので、User Authentication もダメです。しばらくは放置しておいたほうが賢明だと思います。 JSON 文字列を引き渡す更新に関しては、PHP からも簡単に実装できます。Android からも特別な事は必要ありません。 Android : Firebase 用 HttpPut クラス ( URL を非公開にして、ルールを ".write" : true で使用するといいです ) Firebase API を使用すれば、REST API を使用せずとも、ソートや更新が簡単にできますが、他の API との互換性等を考えた場合、このような方法(REST API)も必要かと思います。 ListView と ViewSwitcher アクティビティは、取り回ししやすいように MainActivity のみです。ListView からの1件の表示は ViewSwitcher に設定した別画面(include)で行い、処理は専用の処理クラス(NextPage) を作成してそこで記述するようにしています。ここでは、new GsonBuilder().setPrettyPrinting().create() を使って、JSON 文字列を整形していますが、処理には Gson gson = new Gson() で十分です。 MainActivity REST API では、ソートができないので、ArrayList をソートして使用します。JSON 文字列の扱いは、Google Gson で行います。
public class MainActivity extends AppCompatActivity {
public static int FIRST_PAGE = 0;
public static int NEXT_PAGE = 1;
private MyArrayAdapter adapter;
private ListView listview;
private ViewSwitcher vs;
private NextPage nextPage;
private Gson gson;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 画面表示
MainActivity.this.setContentView(R.layout.activity_main);
// 複数画面処理
vs = (ViewSwitcher) MainActivity.this.findViewById(R.id.viewSwitcher);
// 次画面処理
nextPage = new NextPage(MainActivity.this);
// イベント登録
nextPage.initAction();
// アダプタを作成
adapter = new MyArrayAdapter(MainActivity.this,R.layout.list_item);
// リストビューの取得
listview = (ListView) MainActivity.this.findViewById(R.id.listView);
// リストビューの行をタップした時の処理
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// アダプターを取得
MyArrayAdapter adapter = (MyArrayAdapter)parent.getAdapter();
// 行データを取得
JsonData json = (JsonData)adapter.getItem(position);
String jsonString = gson.toJson(json,JsonData.class);
Log.i("lightbox",jsonString);
View include1 = MainActivity.this.findViewById(R.id.include1);
TextView tv = (TextView) include1.findViewById(R.id.textKey);
tv.setText(json.getCode());
EditText et;
et = (EditText) include1.findViewById(R.id.editName);
et.setText(json.getName());
et = (EditText) include1.findViewById(R.id.editFuri);
et.setText(json.getFuri());
nextPage.setJson(json);
// 画面移動
vs.setDisplayedChild(MainActivity.NEXT_PAGE);
}
});
// リストビューにデータを表示
listview.setAdapter(adapter);
// JSON データの URL ( Firebase を使用 )
String json_url = "https://freebase-654b7.firebaseio.com/class.json?print=pretty";
// tools.jar の static メソッド
Tools.callHttpGet(json_url, "utf-8", new Tools.OnAsyncTaskListener() {
@Override
public void onAsyncTaskListener(String s) {
// JSON データをデシリアライズ
gson = new GsonBuilder().setPrettyPrinting().create();
Type myMap = new TypeToken<Map<String, JsonData>>(){}.getType();
Map<String,JsonData> map = gson.fromJson(s, myMap);
adapter.clear();
// map.values() から ArrayList を作成
ArrayList al = new ArrayList<JsonData>(map.values());
// ソート
Collections.sort(al, new Comparator<JsonData>() {
public int compare(JsonData a, JsonData b) {
String name_a = a.getFuri();
String name_b = b.getFuri();
return name_a.compareTo(name_b);
}
});
// アダプターにセット
adapter.addAll(al);
}
});
}
}
NextPage
public class NextPage {
private MainActivity mainActivity;
private ViewSwitcher vs;
private JsonData json;
public NextPage(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
public void setJson(JsonData json) {
this.json = json;
}
public void initAction(){
// 複数画面処理
vs = (ViewSwitcher) mainActivity.findViewById(R.id.viewSwitcher);
// activity_next.xml の 親 view です
View include1 = mainActivity.findViewById(R.id.include1);
// *****************************************
// 戻るボタン
// *****************************************
Button backButton = (Button)include1.findViewById(R.id.backButton);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 最初の画面へ移動
vs.setDisplayedChild(MainActivity.FIRST_PAGE);
}
});
// *****************************************
// 更新ボタン
// *****************************************
Button updateButton = (Button)include1.findViewById(R.id.updateButton);
updateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Tools.messageBox(mainActivity, "更新確認", "更新しますか?", new Tools.OnMessageBoxListener() {
@Override
public void onMessageBoxYesListener() {
updateData();
}
@Override
public void onMessageBoxNoListener() {
}
});
}
});
}
private void updateData(){
View include1 = mainActivity.findViewById(R.id.include1);
EditText et;
et = (EditText) include1.findViewById(R.id.editName);
json.setName(et.getText().toString());
et = (EditText) include1.findViewById(R.id.editFuri);
json.setFuri(et.getText().toString());
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gson.toJson(json,JsonData.class);
String url = String.format("https://freebase-654b7.firebaseio.com/class/%s.json", json.getCode());
new AsyncTask<String,Void,String>(){
@Override
protected String doInBackground(String... params) {
String result = HttpPut.execute(params[0],params[1],"utf-8");
Log.i("lightbox", result);
return result;
}
@Override
protected void onPostExecute(String s) {
// 最初の画面へ移動
vs.setDisplayedChild(MainActivity.FIRST_PAGE);
}
}.execute(url,jsonString);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<ViewSwitcher
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewSwitcher">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView"/>
<include
android:layout_width="wrap_content"
android:layout_height="wrap_content"
layout="@layout/activity_next"
android:id="@+id/include1"/>
</ViewSwitcher>
</LinearLayout>
MyArrayAdapter オーソドックスな、ListView 用の 専用 ArrayAdapter です。
public class MyArrayAdapter extends ArrayAdapter<JsonData> {
// JsonData を格納する、この処理専用の
// ArrayAdapter のカスタマイズ
// コンストラクタで渡された画面の保存
private int mResource;
public MyArrayAdapter(Context context, int resource) {
super(context, resource);
// ArrayAdapter でも、このようにして保存して利用してます
mResource = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
// 現在の View の取得
// getContext() で super で渡されたものを取得できます
LayoutInflater inflater
= (LayoutInflater) MyArrayAdapter.this.getContext().getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
// super で渡されたものは取得できないので自前で用意します
convertView = inflater.inflate(mResource, null);
}
// アダプターより行データを取得
JsonData json = MyArrayAdapter.this.getItem(position);
// 画面にデータをセット
TextView tv;
// キー
tv = (TextView) convertView.findViewById(R.id.textKey);
tv.setText(json.getCode());
// Subject
tv = (TextView) convertView.findViewById(R.id.textItem1);
tv.setText(json.getName());
// Name
tv = (TextView) convertView.findViewById(R.id.textItem2);
tv.setText(json.getFuri());
// 行の画面をシステムに返す
return convertView;
}
}
JsonData Android Studio では、private の変数を作っておいて、ALT + Insert から Getter and Setter で一気に作成できます。toString() はここでは特に必要ありませんが、Android の単純リソースを使用するなら必要です。 空のコンストラクタも、新規用のコンストラクタもここでは使用しませんが、前者は Firebase API を使用する際には必要になります。後者も使用しませんが、ALT + Insert で簡単に作成できます。 ※ kyuyo が int ではなく long なのも、Firebase API の都合です。
public class JsonData {
private String code;
private String name;
private String furi;
private String birthday;
private String kanri;
private long kyuyo;
private String sex;
private String syozoku;
private String teate;
public JsonData(){}
public JsonData(String birthday, String code, String furi, String kanri, long kyuyo, String name, String sex, String syozoku, String teate) {
this.birthday = birthday;
this.code = code;
this.furi = furi;
this.kanri = kanri;
this.kyuyo = kyuyo;
this.name = name;
this.sex = sex;
this.syozoku = syozoku;
this.teate = teate;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFuri() {
return furi;
}
public void setFuri(String furi) {
this.furi = furi;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getKanri() {
return kanri;
}
public void setKanri(String kanri) {
this.kanri = kanri;
}
public long getKyuyo() {
return kyuyo;
}
public void setKyuyo(long kyuyo) {
this.kyuyo = kyuyo;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSyozoku() {
return syozoku;
}
public void setSyozoku(String syozoku) {
this.syozoku = syozoku;
}
public String getTeate() {
return teate;
}
public void setTeate(String teate) {
this.teate = teate;
}
@Override
public String toString() {
return this.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
- Firebase API + Android Studio : Database のデータを Java に取得する方法は3通りあります。(orderByChild 使う場合は、getChildren ..
- Android : Data Binding + Firebase API で ListView にデータを表示する
- 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 メソッドを使用します


▼ 構成
インターネットデータの読み込みと メッセージボックスの処理は、



