Передача списка другому действию в Android

Я создал список и хотел бы передать его другому действию, но получаю сообщение об ошибке в операторе putExtra, когда создаю намерение. Просто интересно, есть ли простой способ передать список строк, а не одну строку?

Спасибо

private List<String> selItemList;
private ListView mainListView = null;       

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recipes);
        Button searchBtn = (Button) findViewById(R.id.searchButton);
        searchBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (selItemList == null) {
                Toast.makeText(getApplicationContext()," Please Make A Selection ", Toast.LENGTH_SHORT).show();
            } else {
                Intent intent = new Intent(Recipes2.this, XMLParser.class);
                intent.putExtra("items_to_parse", selItemList);
                startActivityForResult(intent, 0);              
            }
        }
        });

person user676567    schedule 22.05.2011    source источник
comment
Можете ли вы добавить к своему вопросу ошибку, которую вы получили в Logcat?   -  person Houcine    schedule 22.05.2011
comment
Привет, Houcine, Eclipse не позволит мне скомпилировать вышеизложенное. Ошибка Метод putExtra(String, boolean) в типе Intent неприменим для аргументов (String, List‹String›)?   -  person user676567    schedule 22.05.2011


Ответы (3)


Вы не можете передать список в Intent.putExtras(String name, List<?> list);. Я думаю, вы можете использовать Array из String и передать его в putExtras следующим образом:

private List<String> selItemList;
private ListView mainListView = null; 

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.recipes);

    Button searchBtn = (Button) findViewById(R.id.searchButton);
    searchBtn.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        if (selItemList == null) {
            Toast.makeText(getApplicationContext(), "Please Make A Selection", Toast.LENGTH_SHORT).show();
        } else {
            String[] selItemArray = new String[selItemList.size()];
            // Copy your List of Strings into the Array, and then pass it in your intent
            // ....
            Intent intent = new Intent(Recipes2.this, XMLParser.class);
            intent.putExtra("items_to_parse", selItemArray);
            startActivityForResult(intent, 0);              
        }
    }
});
person Houcine    schedule 22.05.2011
comment
Я бы также рекомендовал массив строк. - person keyser; 22.05.2011

Вы можете использовать putStringArrayListExtra из Intent

public Intent putStringArrayListExtra (имя строки, значение ArrayList)

  private final List<String> selItemList;
  private ListView mainListView = null;       

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recipes);
        Button searchBtn = (Button) findViewById(R.id.searchButton);
        searchBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            if (selItemList == null) {
                Toast.makeText(Recipes2.this," Please Make A Selection ", Toast.LENGTH_SHORT).show();
            } else {
                Intent intent = new Intent(Recipes2.this, XMLParser.class);
                intent.putStringArrayListExtra("items_to_parse", (ArrayList<String>) selItemList);
                startActivityForResult(intent, 0);              
            }
        }
        });

И в вашем XMLParser.class:

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getIntent().getExtras() != null) {
            for(String a : getIntent().getExtras().getStringArrayList("items_to_parse")) {
                Log.d("=======","Data " + a);
            }
        }
person ccheneson    schedule 22.05.2011
comment
Привет, Ченесон, я попробовал ваше решение, и оно не удалось в строке putStringArrayListExtra с исключением приведения класса: 05-22 12:11:09.267: ERROR/AndroidRuntime(2279): java.lang.ClassCastException: java.util.Arrays$ArrayList - person user676567; 22.05.2011
comment
Спасибо за Ваш ответ! Это решение отлично сработало для меня! - person lomza; 07.11.2011
comment
Приведение типов к (ArrayList<String>) — это действительно классно. Я никогда не знал, что мы можем использовать TypeCast при передаче намерений, все эти дни. - person sam; 20.06.2017

Я знаю, что уже немного поздно, и на этот вопрос уже есть ответ, но вот еще один способ.

просто создайте другой объект, определите его как Serializable и дайте ему переменную списка и отправьте ее, используя putExtra на вашем intent, например:

public class Category implements Serializable {
private List<YourObject> objects;

public Category() {
}

public List<YourObject> getObjects() {
    return objects;
}

public void setObjects(List<YourObject> objects) {
    this.objects = objects;
}

а затем для отправки сделайте следующее:

Category cat = new Category();
cat.setObjects(objects);
intent.putExtra("listOfObjects",cat);
startActivity(intent);

и чтобы получить объект, который вы создали, сделайте следующее:

Category cat = (Category) extras.get("listOfObjects");
cat.getObjects;
person Pouya Danesh    schedule 30.12.2016
comment
java.lang.RuntimeException: Parcelable столкнулся с IOException при записи сериализуемого объекта - person Yaroslav Dukal; 13.07.2017
comment
некоторые объекты не сериализуемы. пожалуйста, проверьте документацию, чтобы увидеть, какие из них являются или нет. developer.android.com/reference/java/io/Serializable.html - person Pouya Danesh; 13.07.2017