【android】Volleyでjsonを取得してListViewに表示する方法メモ
はじめに
今回やりたかったのは、apiを叩いてその結果をListViewに表示するというよくありがちなこと
Volleyは導入済とします
* 実装
レイアウト
activity_main.xml(ListViewを置く画面)
<ListView android:id="@+id/myListView" android:layout_width="match_parent" android:layout_height="match_parent"></ListView>
list_item.xml(ListViewの1行)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/user_name" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/user_address" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </LinearLayout>
プログラム
public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Listviewとデータ周り準備 final ArrayList<UserData> datas = new ArrayList<>(); final UserDataAdapter adapter = new UserDataAdapter(this, 0, datas); ListView listView = (ListView)findViewById(R.id.listView); // apiからデータ取得 String url = "http://example.com/json.php"; RequestQueue queue = Volley.newRequestQueue(this); StringRequest request = new StringRequest(Request.Method.POST,url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); JSONArray userList = jsonObject.getJSONArray("userList"); datas.clear(); for (int i=0; i<userList.length(); i++) { JSONObject user = userList.getJSONObject(i); UserData data = new UserData(); data.setName(user.getString("name")); data.setAddress(user.getString("address")); datas.add(data); } adapter.notifyDataSetChanged(); } catch (JSONException e) { // error } } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error){ //error } }){ }; // 送信 queue.add(request); } public class UserDataAdapter extends ArrayAdapter<UserData> { private LayoutInflater layoutInflater; public UserDataAdapter(Context c, int id, ArrayList<UserData> data) { super(c, id, data); this.layoutInflater = (LayoutInflater) c.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); } @Override public View getView(final int position, View convertView, final ViewGroup parent) { if (convertView == null) { convertView = layoutInflater.inflate( R.layout.list_item, parent, false ); } UserData data = (UserData) getItem(position); TextView name = (TextView)convertView.findViewById(R.id.name); name.setText(data.getName()); TextView address = (TextView)convertView.findViewById(R.id.address); address.setText(data.getAddress()); return convertView; } public class UserData { private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } }
ずらずら書いてみたが
データアダプターの中身を書き換えてnotifyDataSetChangedを呼べば画面にも反映されるので直感的にわかりやすかった
以上です