読者です 読者をやめる 読者になる 読者になる

【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を呼べば画面にも反映されるので直感的にわかりやすかった

以上です