求助:在ListView中展示ArrayList筛选后指定格式的字符串
解决ListView展示自定义对象并提取指定字段的问题
你遇到的核心问题其实有两个:一是默认ArrayAdapter会直接调用Message对象的toString()方法,导致显示的是对象的内存地址;二是需要筛选特定类型的Message并从m_cText中提取订单号来格式化显示。下面给你分步解决:
1. 先筛选符合条件的Message对象
首先得从原始列表里把m_nType == 10002(或者你需要的10000)的对象过滤出来,两种实现方式任你选:
方式一:传统循环过滤
ArrayList<Message> filteredList = new ArrayList<>(); for (Message msg : list) { if (msg.m_nType == 10002) { // 可以加|| msg.m_nType == 10000满足你的多类型判断 filteredList.add(msg); } }
方式二:Java 8 Stream过滤(更简洁)
List<Message> filteredList = list.stream() .filter(msg -> msg.m_nType == 10002) // 同样可扩展多类型判断 .collect(Collectors.toList());
2. 从m_cText中提取订单号
看你给出的m_cText格式是分号分隔的字符串(比如"R;21;9;River Street 2;12154;;1;......."),订单号是第5个元素(索引为4,从0开始计数)。写个工具方法来提取就好:
private String extractOrderNumber(String cText) { String[] parts = cText.split(";"); // 加个判断避免数组越界或空值问题 if (parts.length >= 5 && !parts[4].isEmpty()) { return parts[4]; } return "未知订单号"; // 处理格式异常的情况 }
3. 让ListView显示自定义格式
这里有两种常用方案,根据你的场景选:
方案一:重写Message类的toString()方法(简单直接)
如果能修改Message类,直接重写toString()方法,让它返回你想要的格式:
public class Message { // 你的现有字段:m_cText、m_nType等 public String m_cText; public int m_nType; // ...其他字段 @Override public String toString() { if (m_nType == 10002 || m_nType == 10000) { String orderNum = extractOrderNumber(m_cText); return "Order: " + orderNum; } return super.toString(); // 其他类型保持默认显示 } // 把提取方法放在类里作为成员方法也可以 private String extractOrderNumber(String cText) { String[] parts = cText.split(";"); if (parts.length >= 5 && !parts[4].isEmpty()) { return parts[4]; } return "未知订单号"; } }
之后直接用过滤后的列表初始化Adapter就行:
tuAdapter = new ArrayAdapter<Message>(this, android.R.layout.simple_list_item_1, filteredList); lvOrders.setAdapter(tuAdapter);
方案二:自定义ArrayAdapter(适合不能修改Message类的情况)
如果没法改Message类,就自定义一个Adapter,手动控制显示内容:
public class OrderAdapter extends ArrayAdapter<Message> { private Context mContext; private List<Message> mList; public OrderAdapter(Context context, List<Message> list) { super(context, 0, list); mContext = context; mList = list; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { // 复用convertView优化性能 if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_1, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); Message msg = mList.get(position); String orderNum = extractOrderNumber(msg.m_cText); textView.setText("Order: " + orderNum); return convertView; } private String extractOrderNumber(String cText) { String[] parts = cText.split(";"); if (parts.length >= 5 && !parts[4].isEmpty()) { return parts[4]; } return "未知订单号"; } }
然后使用这个自定义Adapter:
tuAdapter = new OrderAdapter(this, filteredList); lvOrders.setAdapter(tuAdapter);
小提醒
- 如果
Message类的字段是私有(private)的,记得添加对应的getter方法(比如getM_cText()、getM_nType()),然后在代码里调用这些方法获取字段值,别直接访问私有字段哦。 - 一定要处理
m_cText格式异常的情况,避免出现数组越界错误。
内容的提问来源于stack exchange,提问作者Ziriella
相关产品推荐
相关产品推荐

