3

Trying to convert a Arraylist of strings into one big comma separated string.

However when I use the

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

Debugger shows me size of 4 for participants however the joined value as "" therefore empty

enter image description here

private ArrayList<String> participants;

Not sure what is going wrong?

enter image description here

UPDATE:

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

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

This works when I have a list that I manually populate however below is how the code is working right now.

In the onCreate()

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

In callAPI():

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));
}

4 Answers 4

18

I'm trying to reproduce your error and am unable to. Here is my code:

@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);
}

My output is Philip Johnson, Paul Smith, Raja P, Ezhu Malai as expected.

Are you importing the correct TextUtils class?

android.text.TextUtils;

Given the new information, here is my approach:

@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));
        }
    });
}

I don't know what networking library you're using, but you may have to define OnResponseListener as an interface. It's very easy:

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

You will then need to modify your callApi function to take an instance of OnResponseListener> and call it's onResponse method after completing the call.

I would recommend looking into the Volley library, and reading the Android documentation about simple network calls.

Sign up to request clarification or add additional context in comments.

4 Comments

I just copied it and it worked your way. However I am adding the array from a API call. When I revert back to replacing the list with the list updated from the API then it goes back to not showing anything in the join object. Even though the list has 4 string elements.
I have updated my question with more code on how my list is being populated
You should post your network call code. I'm assuming that what is happening is that you aren't waiting on the completion of the call before doing the join, and are therefore joining on an empty list. It won't look like that when debugging, because the networking thread will continue and will populate the list while you're opening the debugging tools.
Thanks I forgot about that, I have a handler and I put the code in there and now it all works!
1

I use StringUtils.join from Apache Common Utilities.

The code is super-simple just the way you wanted,

StringUtils.join(participants,", ");

Works flawlessly for me.

EDIT

As requested, here is the StringUtils.java file for those who just want to use this single utility class and not the entire library.

4 Comments

I would second this answer, but Android has a Dex limit, and Apache Commons is a massive library.
Just use the single StringUtils class. You don't need to include the entire library.
For my own sake, I don't know how to import only a single class from a library. Would you mind pointing to an example of how it can be done?
Have updated the question with the single class file only. Just copy paste this class into your project and you are good to go. Do upvote if it helps.
1

Try with kotlin

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

// output: 'One', 'Two', 'Three', 'Four', 'Five'

Comments

0

I don't know what TextUtils does. This will do it.

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

Easy enough, just use that.

1 Comment

Its giving sb as "". participants still has 4 objects of type string in it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.