Android リストビュー

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView myListView = (ListView) findViewById(R.id.myListView);

        ArrayList<User> users = new ArrayList<>();

        int[] icons = {
            R.mipmap.ic_launcher,
            R.mipmap.ic_launcher,
            R.mipmap.ic_launcher,
        };

        String[] names = {
            "maroni1",
            "maroni2",
            "maroni3",
        };

        String[] locs = {
            "US",
            "UK",
            "JP",
        };

        for (int i = 0; i < icons.length; i++) {
            User user = new User();
            user.setIcon(BitmapFactory.decodeResource(
                getResources(),
                icons[i]
            ));
            user.setName(names[i]);
            user.setLocation(locs[i]);
            users.add(user);
        }

        UserAdapter adapter = new UserAdapter(this, 0, users);


//        for (int i = 0; i < 30; i++) {
//            items.add("item-" + i);
//        }
//
//        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
//            this,
//            R.layout.list_item,
//            items
//        );
//
        myListView.setEmptyView(findViewById(R.id.emptyView));
        myListView.setAdapter(adapter);

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(
                AdapterView<?> parent,
                View view,
                int position,
                long id
            ) {
                TextView name = (TextView)view.findViewById(R.id.name);
                Toast.makeText(
                    MainActivity.this,
                    Integer.toString(position) + ":" + name.getText().toString(),
                    Toast.LENGTH_SHORT
                ).show();
            }
        });
    }

    public class UserAdapter extends ArrayAdapter<User> {
        private LayoutInflater layoutInflater;

        public UserAdapter(Context context, int resource, ArrayList<User> users) {
            super(context, resource, users);
            this.layoutInflater = (LayoutInflater) context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE
            );
        }

        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                convertView = layoutInflater.inflate(
                    R.layout.list_item,
                    parent,
                    false
                );
                holder = new ViewHolder();
                holder.icon = (ImageView) convertView.findViewById(R.id.icon);
                holder.name = (TextView) convertView.findViewById(R.id.name);
                holder.location = (TextView) convertView.findViewById(R.id.loc);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            User user = (User) getItem(position);

            holder.icon.setImageBitmap(user.getIcon());
            holder.name.setText(user.getName());
            holder.location.setText(user.getLocation());

            return convertView;
        }
    }

    static class ViewHolder {
        ImageView icon;
        TextView name;
        TextView location;
    }

    public class User {
        private Bitmap icon;
        private String name;
        private String location;

        public Bitmap getIcon() {
            return icon;
        }

        public void setIcon(Bitmap icon) {
            this.icon = icon;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getLocation() {
            return location;
        }

        public void setLocation(String location) {
            this.location = location;
        }
    }
}