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 メソッドを使用します