Android Studio ArrayList绑定ListView字段提取去重排序
问题描述
需要将存储User对象的ArrayList中的州名字段提取后展示到ListView控件,要求如下:
- 提取所有用户的州名数据(示例数据中对应"New Mexico"、"Arizona"这类值)
- 对提取的州名做两项处理:移除重复值、按字母升序排序
预期ListView最终展示效果:
Arizona California New Mexico
示例User数据集:
private static final ArrayList<User> users = new ArrayList<User>(){{ add(new User("Nevin Hobden",38,"Male","Friend","New Mexico","NM")); add(new User("Stillman Macken",32,"Male","Friend","Arizona","AZ")); add(new User("Stevy Ranscomb",36,"Male","Friend","Arizona","AZ")); add(new User("Lynelle Garstang",22,"Female","Family","California","NE")); }};
当前编写的代码存在逻辑问题,直接将User对象列表传入ArrayAdapter无法正确展示州名字段,现有代码如下:
ListView stateListView; ArrayList<DataServices.User> stateList = DataServices.getAllUsers(); ArrayAdapter<DataServices> arrayListAdapter; stateListView = view.findViewById(R.id.stateListView); arrayListAdapter = new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,android.R.id.text1, stateList); stateListView.setAdapter(arrayListAdapter);
解决方案
ArrayAdapter默认会调用列表元素的toString()方法展示内容,直接传User对象会展示对象的内存地址或者全类名,无法得到想要的州名效果,需要先把需要展示的字段提取、处理完成后再传入适配器,步骤如下:
- 遍历原始
User列表,提取每个对象的州名字段 - 对提取到的州名做去重、升序排序处理,可以直接用
TreeSet一次性完成两个操作,也可以用流处理简化写法 - 将处理完成的字符串类型州名列表传入泛型为
String的ArrayAdapter,绑定到ListView即可
修正后的可运行代码:
ListView stateListView; // 获取原始用户数据列表 ArrayList<DataServices.User> userList = DataServices.getAllUsers(); // TreeSet会自动对存入元素做自然排序,同时自动去重 Set<String> stateSet = new TreeSet<>(); for (DataServices.User user : userList) { // 注意替换getState()为你User类中获取州名字段的实际getter方法 stateSet.add(user.getState()); } // 转换为ArrayList供适配器使用 ArrayList<String> displayStateList = new ArrayList<>(stateSet); stateListView = view.findViewById(R.id.stateListView); // 适配器泛型指定为String,传入处理好的州名字符串列表 ArrayAdapter<String> adapter = new ArrayAdapter<>( getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, displayStateList ); stateListView.setAdapter(adapter);
如果项目使用Java 8及以上版本,字段提取和处理逻辑可以用流操作简化,替代上面的循环+TreeSet部分:
List<String> displayStateList = userList.stream() .map(DataServices.User::getState) // 替换为实际的州名getter方法 .distinct() // 去重 .sorted() // 按自然顺序升序排序 .collect(Collectors.toList());
注意:如果运行后没有正确展示州名,请先检查User类中对应州名字段的getter方法名是否和代码中调用的一致,比如字段名为state时,标准getter方法为getState(),如果字段命名有差异自行替换即可。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

