[アンドロイド] JSONのtrongのアンドロイド – 一部 4: JavaでJSONを取得する処理
あなた明かします, それのための引当金は、シリーズの最後の部分になります JSONのtrongのアンドロイド. 私たちは、Javaコードの取り扱い注意事項を記述し、最も重要なのは、前節からのJSON出力をとっています.
コンテンツ
アップデート: 21/08/2015 – 最適化コード.
私たちのJavaの構造は、次のファイルが含まれて (ファイルの比較的少数のために何がパッケージに分類していません).
ライティングクラスコンフィギュレーション, 準備
それは少し紛らわしいと言うが、実際にこれを. 我々はいくつかの特定の値を保存するために、いくつかの定数を必要とする、それがクラスにあります どこ. オブジェクトとの容易な操作のために “かつての恋人” その後、我々は、クラスを持っている必要があります ラヴァー. JSONを下に取得するために、我々はLoadJsonことを労働者階級を必要とします.
建設定数
package cachhoc.net.demojson; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.widget.Toast; public class Var { // const for load and put data with server public static final String KEY_METHOD = "method"; public static final String KEY_NICK = "nick"; public static final String KEY_PASS = "pass"; public static final String KEY_ID = "id"; public static final String KEY_NAME = "name"; public static final String KEY_PHONE = "phone"; public static final String KEY_BEGIN_DATE = "begin_date"; public static final String KEY_END_DATE = "end_date"; public static final String KEY_LOGIN = "login"; public static final String KEY_REGISTER = "register"; public static final String KEY_ADD = "add"; public static final int METHOD_LOGIN = 1; public static final int METHOD_REGISTER = 2; public static final int METHOD_GET_OLD_LOVER = 3; public static final int METHOD_ADD_OLD_LOVER = 4; public static void showToast(Context context, String sms) { Toast.makeText(context, sms, Toast.LENGTH_SHORT).show(); } // method for save and get nick and pass user public static void save(Context context, String key, String value) { SharedPreferences.Editor editor = PreferenceManager .getDefaultSharedPreferences(context.getApplicationContext()) .edit(); editor.putString(key, value); editor.apply(); } public static String get(Context context, String key) { SharedPreferences settings = PreferenceManager .getDefaultSharedPreferences(context.getApplicationContext()); return settings.getString(key, null); } }
何も混乱していません, 彼のクラスでちょうど私たちが使用することに注意してください SharedPreferences ニックとパスワードを保存するために、ユーザは、後にログインすることを忘れないようにしたい場合. それはまた、多くの場合、設定を保存するために使用され (設定) アプリケーション.
建設クラスの恋人
私たちの恋人になります 5 学校はIDです, 名前, 電話, 日付を開始 (開始日の愛) VA終了日 (デイ別れ).
package cachhoc.net.demojson; import org.json.JSONException; import org.json.JSONObject; public class Lover { private int id; private String name; private String phone; private String beginDate; private String endDate; public Lover() { } public Lover(int id, String name, String phone, String beginDate, String endDate) { this.id = id; this.name = name; this.phone = phone; this.beginDate = beginDate; this.endDate = endDate; } public int getId() { return id; } public Lover setId(int id) { this.id = id; return this; } public String getName() { return name; } public Lover setName(String name) { this.name = name; return this; } public String getPhone() { return phone; } public Lover setPhone(String phone) { this.phone = phone; return this; } public String getBeginDate() { return beginDate; } public Lover setBeginDate(String beginDate) { this.beginDate = beginDate; return this; } public String getEndDate() { return endDate; } public Lover setEndDate(String endDate) { this.endDate = endDate; return this; } public String toJSON() { JSONObject jsonObject = new JSONObject(); try { jsonObject.put(Var.KEY_ID, getId()); jsonObject.put(Var.KEY_NAME, getName()); jsonObject.put(Var.KEY_PHONE, getPhone()); jsonObject.put(Var.KEY_BEGIN_DATE, getBeginDate()); jsonObject.put(Var.KEY_END_DATE, getEndDate()); return jsonObject.toString(); } catch (JSONException e) { e.printStackTrace(); return ""; } } }
あなたの注意ゲッターは通常、私たちは何と通常値を払っていません 公共のボイド… 私はそれがオブジェクトの恋人を返し書きました (これを返します). これは私たちに容易な操作を提供します. たとえばあなたが設定したいとき 2 名前と電話値、あなたが書く必要があります 2 あなたのような市場に行くときlover.setPhone lover.setName時間などは、よりゆっくりとマシンの実行を行うことができます, あなたは野菜を購入し、上で実行します, その後買い豆を実行します,… そして、私はちょうどよ lover.setName(…).setPhone(…) すなわち野菜の買い物、常に豆を買います. =))
方法 toJSON 私は転送することが書いて 1 サーバに送信されたデータ操作を容易にするためにJSON形式にオブジェクト, しかし、このアプリケーションでは、私はそれを使用しないでください, あなたが知っているだけ他のアプリのために使用することができるように書きます.
建設クラスLoadJSon
実際に撮影しただけでなく、より多くの処理までにJSONデータを送信しません. 建設ファイル前日など lover.php 私たちは、変数メソッドを介しての行為を区別することを述べています.
package cachhoc.net.demojson; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import org.apache.http.Header; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; public class LoadJson { public static final String LINK = "https://cachhoc.net/mobile/demo-json/lover.php"; public void sendDataToServer(int method, HashMap<String, String> map) { AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); // put data to server params.put(Var.KEY_METHOD, method); if (map != null) { for (String key : map.keySet()) { params.put(key, map.get(key)); } } System.out.println("Post..."); client.post(LINK, params, new AsyncHttpResponseHandler() { @SuppressWarnings("deprecation") @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { String json = new String(responseBody); System.out.println("onSuccess:" + json); onFinishLoadJSonListener.finishLoadJSon(null, json); } @SuppressWarnings("deprecation") @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { System.out.println("onFailure:" + statusCode); String e; if (statusCode == 404) { e = "Requested resource not found"; } else if (statusCode == 500) { e = "Something went wrong at server end"; } else { e = "Device might not be connected to Internet"; } onFinishLoadJSonListener.finishLoadJSon(e, null); } }); } public static Lover jsonToLover(JSONObject jsonObject) { try { int id = jsonObject.getInt(Var.KEY_ID); String name = jsonObject.getString(Var.KEY_NAME); String phone = jsonObject.getString(Var.KEY_PHONE); String beginDate = jsonObject.getString(Var.KEY_BEGIN_DATE); String endDate = jsonObject.getString(Var.KEY_END_DATE); return new Lover(id, name, phone, beginDate, endDate); } catch (JSONException e) { e.printStackTrace(); return null; } } public static ArrayList<Lover> jsonToListLover(String json) { ArrayList<Lover> list = new ArrayList<>(); try { JSONArray arraySMSJson = new JSONArray(json); for (int i = 0; i < arraySMSJson.length(); i++) { JSONObject jsonObject = arraySMSJson.getJSONObject(i); Lover lover = jsonToLover(jsonObject); if (lover != null) { list.add(lover); } } } catch (JSONException e) { e.printStackTrace(); } return list; } public interface OnFinishLoadJSonListener { void finishLoadJSon(String error, String json); } public OnFinishLoadJSonListener onFinishLoadJSonListener; public void setOnFinishLoadJSonListener(OnFinishLoadJSonListener onFinishLoadJSonListener) { this.onFinishLoadJSonListener = onFinishLoadJSonListener; } }
その中で:
- 定数LINKは出力ファイルのJSONへのパスです – lover.phpファイルすでに構築前夜.
-
方法 sendDataToServer 持っている 2 引数は、アクションを区別するための方法であり、 (ログイン, 登録, 負荷JSON, 恋人を追加) 治療を区別するために、サーバー上のファイルlover.php. 変数 HashMapの<文字列, 文字列>地図 私たちはあきらめたデータのためのキーと値のペアのリストです, サーバー上の対応する値を取得するための鍵に基づいて行われます.
-
我々はclient.post呼び出された場合() システムは、サーバにデータを送信するためにバックグラウンドを実行します. 終了すると、システムが自動的にメソッドを呼び出します するonSuccess (成功しました) または ONFAILURE (罪を犯しました) し、対応する値を返します。. 方法では するonSuccess その後 responseBody 我々は、約得る.jsonです, それはバイトを必要とし、文字列に移動します.
-
JSONを取得し、他のクラスのプロセッサを提供します, 私たちは、そのインターフェイスを構築します OnFinishLoadJSonListener モダリティ finishLoadJSon(文字列のエラー, 文字列のJSON) 他のクラスにJSONやエラーが治療の後に撮影した実装.
-
この中でも、あなたに組み込まれています 2 メソッド jsonToLover と jsonToListLover 文字列のJSONオブジェクトまたはリストの恋人の恋人に変換します.
聞いて来て、やや長期的. 最も重要な部分は、JSONは、グリッチを持って取得することです. 私たちは、取り扱い続けます 4 アクティビティ.
活動の取り扱い
インタフェース部と同様に、, 私たちはステップをオンに移動します:
コンフィギュレーション, チュアンBI - >ログイン - >登録 - >リストオールド恋人 - >恋人を追加
そして、彼のコードの中で、それは多くの説明を必要としないことも非常に明確なメソッドに名前を付けます.
活動ログイン
ログインするには、我々はニックを送信し、システムチェックを渡す必要があります, lover.phpファイルはチェックし、trueの場合、新しいは、ログイン.
package cachhoc.net.demojson; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class LoginActivity extends AppCompatActivity implements View.OnClickListener, LoadJson.OnFinishLoadJSonListener { private EditText editNick, editPass; private CheckBox cbRememberPass; private LoadJson loadJson; private Context context; private ProgressDialog progressDialog; private String nick, pass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); context = this; setupToolbar(); connectView(); loadJson = new LoadJson(); loadJson.setOnFinishLoadJSonListener(this); progressDialog = new ProgressDialog(context); progressDialog.setMessage(context.getResources().getString(R.string.wait)); } private void setupToolbar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setTitle(R.string.login); } } } private void connectView() { editNick = (EditText) findViewById(R.id.edit_nick); editPass = (EditText) findViewById(R.id.edit_pass); cbRememberPass = (CheckBox) findViewById(R.id.cb_remember); findViewById(R.id.btn_login).setOnClickListener(this); findViewById(R.id.btn_register).setOnClickListener(this); // get nick and pass if it be remember nick = Var.get(context, Var.KEY_NICK); pass = Var.get(context, Var.KEY_PASS); if (nick != null && pass != null) { editNick.setText(nick); editPass.setText(pass); cbRememberPass.setChecked(true); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_login: login(); break; case R.id.btn_register: register(); break; default: break; } } private void register() { Intent intent = new Intent(context, RegisterActivity.class); startActivity(intent); } private void login() { nick = editNick.getText().toString().trim(); pass = editPass.getText().toString().trim(); // not enter nick name if (nick.length() == 0) { editNick.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_nick)); return; } // not enter pass if (pass.length() == 0) { editPass.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_pass)); return; } // save nick and pass if (cbRememberPass.isChecked()) { Var.save(context, Var.KEY_NICK, nick); Var.save(context, Var.KEY_PASS, pass); } else { Var.save(context, Var.KEY_NICK, null); Var.save(context, Var.KEY_PASS, null); } HashMap<String, String> map = new HashMap<>(); map.put(Var.KEY_NICK, nick); map.put(Var.KEY_PASS, pass); loadJson.sendDataToServer(Var.METHOD_LOGIN, map); progressDialog.show(); } @Override public void finishLoadJSon(String error, String json) { if (progressDialog.isShowing()) { progressDialog.hide(); } try { if (json != null) { JSONObject jsonObject = new JSONObject(json); if (jsonObject.getBoolean(Var.KEY_LOGIN)) { Var.showToast(context, context.getResources().getString(R.string.login_success)); Intent intent = new Intent(context, MainActivity.class); intent.putExtra(Var.KEY_NICK, nick); startActivity(intent); finish(); } else { Var.showToast(context, context.getResources().getString(R.string.login_fail)); } } else { Var.showToast(context, error); } } catch (JSONException e) { e.printStackTrace(); } } }
アクティビティの登録
いいえアカウントの場合, 我々は、データベースシステムに追加するために登録する必要があります.
package cachhoc.net.demojson; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.EditText; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class RegisterActivity extends AppCompatActivity implements View.OnClickListener, LoadJson.OnFinishLoadJSonListener { private EditText editNick, editPass, editRePass; private LoadJson loadJson; private Context context; private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); context = this; setupToolbar(); connectView(); loadJson = new LoadJson(); loadJson.setOnFinishLoadJSonListener(this); progressDialog = new ProgressDialog(context); progressDialog.setMessage(context.getResources().getString(R.string.wait)); } private void setupToolbar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setTitle(R.string.register); } } } private void connectView() { editNick = (EditText) findViewById(R.id.edit_nick); editPass = (EditText) findViewById(R.id.edit_pass); editRePass = (EditText) findViewById(R.id.edit_re_pass); findViewById(R.id.btn_reset).setOnClickListener(this); findViewById(R.id.btn_register).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_reset: reset(); break; case R.id.btn_register: register(); break; default: break; } } private void reset() { editNick.setText(""); editPass.setText(""); editRePass.setText(""); editNick.requestFocus(); } private void register() { String nick = editNick.getText().toString().trim(); String pass = editPass.getText().toString().trim(); String repass = editRePass.getText().toString().trim(); // not enter nick name if (nick.length() == 0) { editNick.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_nick)); return; } // not enter pass if (pass.length() == 0) { editPass.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_pass)); return; } // not enter pass if (repass.length() == 0) { editRePass.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_repass)); return; } if (!repass.equals(pass)) { editPass.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.pass_not_match)); return; } HashMap<String, String> map = new HashMap<>(); map.put(Var.KEY_NICK, nick); map.put(Var.KEY_PASS, pass); loadJson.sendDataToServer(Var.METHOD_REGISTER, map); progressDialog.show(); } @Override public void finishLoadJSon(String error, String json) { if (progressDialog.isShowing()) { progressDialog.hide(); } try { if (json != null) { JSONObject jsonObject = new JSONObject(json); if (jsonObject.getBoolean(Var.KEY_REGISTER)) { Var.showToast(context, context.getResources().getString(R.string.register_success)); finish(); } else { Var.showToast(context, context.getResources().getString(R.string.register_fail)); } } else { Var.showToast(context, error); } } catch (JSONException e) { e.printStackTrace(); } } }
アクティビティ恋人を追加
package cachhoc.net.demojson; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; import org.json.JSONException; import org.json.JSONObject; import java.util.Calendar; import java.util.HashMap; public class AddLoverActivity extends AppCompatActivity implements View.OnClickListener, LoadJson.OnFinishLoadJSonListener, DatePickerDialog.OnDateSetListener { private EditText editName, editPhone; private Button btnBeginDate, btnEndDate; private LoadJson loadJson; private Context context; private ProgressDialog progressDialog; private String nick; // for begin date or end date private int typeDate; private String beginDate = "", endDate = ""; public static final int BEGIN_DATE = 0; public static final int END_DATE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_lover); context = this; setupToolbar(); connectView(); loadJson = new LoadJson(); loadJson.setOnFinishLoadJSonListener(this); progressDialog = new ProgressDialog(context); progressDialog.setMessage(context.getResources().getString(R.string.wait)); nick = getIntent().getStringExtra(Var.KEY_NICK); } private void setupToolbar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setTitle(R.string.title_activity_add_lover); } } } private void connectView() { editName = (EditText) findViewById(R.id.edit_name); editPhone = (EditText) findViewById(R.id.edit_phone); btnBeginDate = (Button) findViewById(R.id.btn_begin_date); btnEndDate = (Button) findViewById(R.id.btn_end_date); btnBeginDate.setOnClickListener(this); btnEndDate.setOnClickListener(this); findViewById(R.id.btn_add).setOnClickListener(this); findViewById(R.id.btn_reset).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_reset: reset(); break; case R.id.btn_add: add(); break; case R.id.btn_begin_date: typeDate = BEGIN_DATE; showDatePicker(); break; case R.id.btn_end_date: typeDate = END_DATE; showDatePicker(); break; default: break; } } private void showDatePicker() { Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( this, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); String title; if (typeDate == BEGIN_DATE) { title = context.getResources().getString(R.string.begin_date); } else { title = context.getResources().getString(R.string.end_date); } dpd.show(getFragmentManager(), title); } @Override public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { String date = dayOfMonth + "/" + monthOfYear + "/" + year; if (typeDate == BEGIN_DATE) { beginDate = date; btnBeginDate.setText(date); } else { endDate = date; btnEndDate.setText(date); } } private void reset() { editName.setText(""); editPhone.setText(""); editName.requestFocus(); } private void add() { String name = editName.getText().toString().trim(); String phone = editPhone.getText().toString().trim(); // not enter nick name if (name.length() == 0) { editName.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_nick)); return; } // not enter pass if (phone.length() == 0) { editPhone.requestFocus(); Var.showToast(context, context.getResources().getString(R.string.enter_pass)); return; } HashMap<String, String> map = new HashMap<>(); map.put(Var.KEY_NICK, nick); map.put(Var.KEY_NAME, name); map.put(Var.KEY_PHONE, phone); map.put(Var.KEY_BEGIN_DATE, beginDate); map.put(Var.KEY_END_DATE, endDate); loadJson.sendDataToServer(Var.METHOD_ADD_OLD_LOVER, map); progressDialog.show(); } @Override public void finishLoadJSon(String error, String json) { if (progressDialog.isShowing()) { progressDialog.hide(); } try { if (json != null) { JSONObject jsonObject = new JSONObject(json); if (jsonObject.getBoolean(Var.KEY_ADD)) { Var.showToast(context, context.getResources().getString(R.string.add_success)); finish(); } else { Var.showToast(context, context.getResources().getString(R.string.add_fail)); } } else { Var.showToast(context, error); } } catch (JSONException e) { e.printStackTrace(); } } }
活動の主な – リストの恋人
この中には 2 我々はリストとリストアダプタを処理する必要が一部.
ファイルMainActivity.java
package cachhoc.net.demojson; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; public class MainActivity extends AppCompatActivity implements View.OnClickListener, LoadJson.OnFinishLoadJSonListener { private ItemAdapter adapter; private ArrayList<Lover> list; private LoadJson loadJson; private Context context; private ProgressBar progressBar; private ViewGroup layoutProgress; private TextView tvNotify; private String nick; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; loadJson = new LoadJson(); loadJson.setOnFinishLoadJSonListener(this); setupToolbar(); setupRecyclerView(); findViewById(R.id.fab_add).setOnClickListener(this); layoutProgress = (ViewGroup) findViewById(R.id.layout_progress); progressBar = (ProgressBar) findViewById(R.id.progress); tvNotify = (TextView) findViewById(R.id.tv_notify); nick = getIntent().getStringExtra(Var.KEY_NICK); } private void setupToolbar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); } } private void setupRecyclerView() { RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_lover); // If the size of views will not change as the data changes. recyclerView.setHasFixedSize(true); // Setting the LayoutManager. RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // Setting the adapter. list = new ArrayList<>(); adapter = new ItemAdapter(context, list); recyclerView.setAdapter(adapter); } public void onResume() { super.onResume(); refresh(); } /** * re load data from server */ private void refresh() { HashMap<String, String> map = new HashMap<>(); map.put(Var.KEY_NICK, nick); loadJson.sendDataToServer(Var.METHOD_GET_OLD_LOVER, map); layoutProgress.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE); tvNotify.setVisibility(View.GONE); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_logout: logout(); break; case R.id.action_refresh: refresh(); break; } return super.onOptionsItemSelected(item); } private void logout() { Intent intent = new Intent(context, LoginActivity.class); startActivity(intent); finish(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.fab_add: addOldLover(); break; } } private void addOldLover() { Intent intent = new Intent(context, AddLoverActivity.class); intent.putExtra(Var.KEY_NICK, nick); startActivity(intent); } @Override public void finishLoadJSon(String error, String json) { if (json != null) { layoutProgress.setVisibility(View.GONE); updateList(json); } else { showNotify(error); } } private void updateList(String json) { ArrayList<Lover> newList = LoadJson.jsonToListLover(json); list.clear(); list.addAll(newList); adapter.notifyDataSetChanged(); if (list.size() == 0) { showNotify(context.getResources().getString(R.string.no_lover)); } } private void showNotify(String notify) { layoutProgress.setVisibility(View.VISIBLE); progressBar.setVisibility(View.GONE); tvNotify.setVisibility(View.VISIBLE); tvNotify.setText(notify); } /** * double click back then exit app (2 click in 2s to exit) */ @Override public void onBackPressed() { if (doubleBackToExitPressedOnce) { super.onBackPressed(); return; } this.doubleBackToExitPressedOnce = true; Var.showToast(context, context.getResources().getString(R.string.back_to_exit)); new Handler().postDelayed(new Runnable() { @Override public void run() { doubleBackToExitPressedOnce = false; } }, 2000); } private boolean doubleBackToExitPressedOnce; }
これで、あなたは彼の注意上書き方法の下部にあります onBackPressed ユーザーが戻って押し通知します 2 エスケープ前の回. 2 2S内にこの出版物は回連続 (200 ミリ秒)
ItemAdapter.javaファイル
package cachhoc.net.demojson; import android.content.Context; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.RecyclerViewHolder> { private List<Lover> list; private Context context; public ItemAdapter(Context context, List<Lover> list) { this.context = context; this.list = list; } @Override public int getItemCount() { return list.size(); } /** * connect to item view */ @Override public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View itemView = inflater.inflate(R.layout.item, viewGroup, false); return new RecyclerViewHolder(itemView); } /** * set data for item */ @Override public void onBindViewHolder(RecyclerViewHolder viewHolder, int position) { Lover lover = list.get(position); viewHolder.tvName.setText(lover.getName()); viewHolder.tvPhone.setText(lover.getPhone()); viewHolder.tvBeginDate.setText(lover.getBeginDate()); viewHolder.tvEndDate.setText(lover.getEndDate()); } /** * ViewHolder for item view of list */ public class RecyclerViewHolder extends RecyclerView.ViewHolder implements OnClickListener { public CardView container; public TextView tvName; public TextView tvPhone; public TextView tvBeginDate; public TextView tvEndDate; public RecyclerViewHolder(View itemView) { super(itemView); container = (CardView) itemView.findViewById(R.id.item_container); tvName = (TextView) itemView.findViewById(R.id.tv_name); tvPhone = (TextView) itemView.findViewById(R.id.tv_phone); tvBeginDate = (TextView) itemView.findViewById(R.id.tv_begin_date); tvEndDate = (TextView) itemView.findViewById(R.id.tv_end_date); container.setOnClickListener(this); } // click item then display note @Override public void onClick(View v) { Var.showToast(context, list.get(getAdapterPosition()).getName()); } } }
だから我々は、アプリケーションを完了しました. 最後になりましたが長めのが、難しいことではありません.
あなたは、プロジェクトをダウンロードすることができます ここに
ファイルのダウンロードチャイ OldLover.apk
Chúc các bạn học tập vui vẻ 🙂
チュートリアルで行われた投稿 JSONのtrongのアンドロイド によって nguyenvanquan7826
彼は私に尋ねました https://cachhoc.net/mobile/demo-json/lover.php 弟はそれから来て理解することなく、これを読んで
その私達のデータベースで作られました, あなたはチュートリアル数を参照してください 2 NHE
https://www.cachhoc.net/2015/08/18/android-json-trong-android-phan-2-xuat-json-tu-database-bang-php/
自問してみてください 1 chút được không. Mình tạo database sau đó đẩy dữ liệu vào trong database . Dữ liệu mình đưa vào là công thức toán học nên khi vào trong database nó không hiển thị được dẫn đến việc trả ra chuổi JSON cũng không hiển thị được công thức toán học. Bạn cho hình hỏi có cách nào xử lý không? 彼のおかげで
ああ, 彼の数式について試していません, それはどのように明確ではありません
自問してみてください、このようなHTMLのリストビューKにhtmlタグを表示することができます?
依頼します, ウェブ上のデータベースに保存することはできません送信するとき、私は、データが正しくベトナム語で書かれていないことを知りませんでした, 結果は=空白です, あなたは、このエラーを修正するにはどうすればよいです, và như JSON của bạn L\u00f2 L\u1ea5p L\u00f3, オリジナルではないようにそれを正しく復号することができるのAndroidから読み取ります. 感謝.
データベース・ビューの書式設定テキストを再試行してくださいを参照してください。, 自分自身またはUTF-8ユニコードすべき
私はそれを修正しました, もっとありがとうございます, 非常に有用な記事. あなたが複数のアレイリストを送信する場合は、自分自身に問います, 代わりに1を送信します, ただで送信する方法 1 時間ありません.
あなただけの入力します 1 リストが含まれているオブジェクトがあります
あなたは彼女のハンドルを手助けする方法を知りませんでしたように私はいた私の友人はあなたではありません
あなたはそれを見データベース形式でフォントを参照してください。. 通常、UTF8
ウェイター, 私に聞いてみましょう: 私はリンクを持っているapi_url, 単独のクラスをスキップすることができ、URLにデータを送信するためにPOSTメソッドとLover.java Var.javaないこと? クラスはどのようにLoadJson.java SIRを変更する必要があります?
ヴァールクラスは、ちょうどのみ一定のURLを保存します, あなたはよく残して, 代わりに、あなたは、直接URLを転送します.