You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:29:21