【问题标题】:Arraylist of strings into one comma separated string字符串数组列表到一个逗号分隔的字符串
【发布时间】:2017-04-10 21:02:38
【问题描述】:

试图将字符串的 Arraylist 转换为一个逗号分隔的大字符串。

但是当我使用

String joined = TextUtils.join(", ", participants);

调试器向我显示参与者的大小为 4,但连接值为 "" 因此为空

private ArrayList<String> participants;

不知道出了什么问题?

更新:

List<String> list = new ArrayList<>();
list.add("Philip");
list.add("Paul Smith");
list.add("Raja");
list.add("Ez");

String s = TextUtils.join(", ", list);

这在我有一个手动填充的列表时有效,但下面是代码现在的工作方式。

在onCreate()中

callApi(type);
String s = TextUtils.join(", ", participants);
getSupportActionBar().setTitle(s);

在调用API()中:

JSONArray participantsR = sub.getJSONArray("referralParticipants");

Log.e("Participants length ", String.valueOf(participantsR.length()));

for (int i = 0; i < participantsR.length(); i++)
{
    JSONObject object = participantsR.getJSONObject(i);
    String firstname = (String) object.get("fullName");
    participants.add(firstname);
    Log.e("Times", String.valueOf(i));
}

【问题讨论】:

    标签: android string arraylist


    【解决方案1】:

    我正在尝试重现您的错误,但无法重现。这是我的代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temp);
    
        List<String> list = new ArrayList<>();
        list.add("Philip Johnson");
        list.add("Paul Smith");
        list.add("Raja P");
        list.add("Ezhu Malai");
    
        String s = TextUtils.join(", ", list);
    
        Log.d(LOGTAG, s);
    }
    

    正如预期的那样,我的输出是Philip Johnson, Paul Smith, Raja P, Ezhu Malai

    您是否导入了正确的 TextUtils 类?

    android.text.TextUtils;

    鉴于新信息,这是我的方法:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temp);
    
        callApi(type, new OnResponseListener<List<String>>() {
            @Override public void onResponse(List<String> list) {
                getSupportActionBar().setTitle(TextUtils.join(", ", list));
            }
        });
    }
    

    我不知道您使用的是什么网络库,但您可能必须将 OnResponseListener 定义为接口。很简单:

    public interface OnResponseListener<T> {
        public void onResponse(T response);
    }
    

    然后,您需要修改 callApi 函数以获取 OnResponseListener> 的实例,并在完成调用后调用它的 onResponse 方法。

    我建议查看Volley library,并阅读Android documentation 了解简单的网络调用。

    【讨论】:

    • 我刚刚复制了它,它按你的方式工作。但是我正在从 API 调用中添加数组。当我恢复用从 API 更新的列表替换列表时,它又回到连接对象中不显示任何内容。即使列表有 4 个字符串元素。
    • 我更新了我的问题,添加了更多关于如何填充我的列表的代码
    • 您应该发布您的网络调用代码。我假设正在发生的事情是您在加入之前没有等待呼叫完成,因此加入了一个空列表。调试时不会这样,因为网络线程将继续运行,并会在您打开调试工具时填充列表。
    • 谢谢,我忘了,我有一个处理程序,我把代码放在那里,现在一切正常!
    【解决方案2】:

    我使用来自 Apache Common Utilities 的 StringUtils.join

    代码非常简单,正是您想要的方式,

    StringUtils.join(participants,", ");
    

    对我来说完美无缺。

    编辑

    根据要求,这里是 StringUtils.java 文件,供那些只想使用这个单一实用程序类而不是整个库的人使用。

    【讨论】:

    • 我会支持这个答案,但 Android 有 Dex 限制,而 Apache Commons 是一个庞大的库。
    • 只需使用单个 StringUtils 类。您不需要包含整个库。
    • 为了我自己,我不知道如何从库中只导入一个类。您介意举个例子说明它是如何完成的吗?
    • 仅使用单个类文件更新了问题。只需将此类复制粘贴到您的项目中即可。如果有帮助,请点赞。
    【解决方案3】:

    我不知道 TextUtils 是做什么的。这会做到的。

    StringBuffer sb = new StringBuffer();
    for (String x : participants) {
        sb.append(x);
        sb.append(", ");
    }
    return sb.toString();
    

    很简单,只要使用它。

    【讨论】:

    • 它给某人作为“”。参与者中仍然有 4 个字符串类型的对象。
    【解决方案4】:

    用 kotlin 试试

    val commaSeperatedString = listOfStringColumn.joinToString { it -> 
     "\'${it.nameOfStringVariable}\'" }
    

    // 输出:'一','二','三','四','五'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多