Truyền ArrayList qua Intent


82

Tôi đang cố gắng chuyển một arrayList sang một hoạt động khác bằng cách sử dụng ý định. Đây là mã trong hoạt động đầu tiên.

case R.id.editButton:
        Toast.makeText(this, "edit was clicked", Toast.LENGTH_LONG).show();
        Intent intent = new Intent(this, editList.class);
        intent.putStringArrayListExtra("stock_list", stock_list);
        startActivity(intent);
        break;

Đây là nơi tôi cố gắng truy xuất danh sách trong hoạt động thứ hai. Có gì đó không ổn ở đây?

Intent i = new Intent(); //This should be getIntent();
    stock_list = new ArrayList<String>();

    stock_list = i.getStringArrayListExtra("stock_list");

Câu trả lời:


105

Với mục đích nhận của bạn, bạn cần phải làm:

Intent i = getIntent();  
stock_list = i.getStringArrayListExtra("stock_list");

Theo cách bạn có nó, bạn vừa tạo ra một ý định trống mới mà không có bất kỳ tính năng bổ sung nào.

Nếu bạn chỉ có thêm một khoản tiền duy nhất, bạn có thể cô đọng điều này thành:

stock_list = getIntent().getStringArrayListExtra("stock_list");

20

Tôi đã thực hiện điều này bằng cách Truyền ArrayList dưới dạng Chuỗi .

  1. Thêm compile 'com.google.code.gson:gson:2.2.4'vào khối phụ thuộc build.gradle .

  2. Nhấp vào Đồng bộ hóa dự án với tệp Gradle

Cars.java :

public class Cars {
    public String id, name;
}

FirstActivity.java

Khi bạn muốn để vượt qua ArrayList :

List<Cars> cars= new ArrayList<Cars>();
cars.add(getCarModel("1", "A"));
cars.add(getCarModel("2", "B"));
cars.add(getCarModel("3", "C"));
cars.add(getCarModel("4", "D"));

Gson gson = new Gson();

String jsonCars = gson.toJson(cars);

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("list_as_string", jsonCars);
startActivity(intent);

Nhận CarsModel theo chức năng :

private Cars getCarModel(String id, String name){
       Cars cars = new Cars();
       cars.id = id;
       cars.name = name;
    return cars;
 }

SecondActivity.java

Bạn phải nhập khẩu java.lang.reflect.Type;

trên onCreate () để truy xuất ArrayList :

String carListAsString = getIntent().getStringExtra("list_as_string");

Gson gson = new Gson();
Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(carListAsString, type);
for (Cars cars : carsList){
   Log.i("Car Data", cars.id+"-"+cars.name);
}

Hy vọng điều này sẽ tiết kiệm thời gian, tôi đã lưu nó.

Làm xong


3
Hoặc bạn có thể chỉ cần để lớp mô hình Cars của bạn thực hiện giao diện Parcelable và chỉ cần thực hiện ý định.putParcelableArrayListExtra ("parecelable_list", CarsList); nơi carsList là một thể hiện của ArrayList <Ô tô>
Nouman Hanif

1
Downvoter nên quan tâm đến việc thêm bình luận làm lý do.
Hiren Patel

3
Tại sao tôi sẽ sử dụng Gson nếu đã có intent.putStringArrayListExtra, intent.getStringArrayListExtrahoặc getSerializableExtratồn tại. Và nếu tôi sử dụng nhật thực thì sao? Tôi phải tải xuống và thêm thư viện Gson?
Tushar Monirul

2 bit của tôi ... Bạn không thể bỏ phiếu cho điều này vì lý do đó, nhưng bạn nên khuyên bạn nên Hủy qua Serializing vì nó đã được chứng minh nhiều lần - đối với Android, hiệu quả hơn & out thực hiện Serialization.
user3833732

13

nếu bạn sử dụng Danh sách mảng chung với Lớp thay vì loại cụ thể như

VÍ DỤ:

private ArrayList<Model> aListModel = new ArrayList<Model>();

Đây, Model = Class

Nhận được Ý định Thích:

aListModel = (ArrayList<Model>) getIntent().getSerializableExtra(KEY);

PHẢI NHỚ:

Ở đây Model-class phải được triển khai như: ModelClass triển khai Serializable


Thông thường như Sending Ý định cho startActivityForResult : Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, aListModel);
Dhruv Raval

5

Giả sử bạn cần chuyển một danh sách mảng của lớp sau từ hoạt động hiện tại sang hoạt động tiếp theo // lớp của các đối tượng trong danh sách mảng // hãy nhớ triển khai lớp từ giao diện Serializable // Serializable có nghĩa là nó chuyển đổi đối tượng thành dòng byte và giúp để chuyển đối tượng đó

public class Question implements Serializable {
... 
... 
...
}

trong hoạt động hiện tại của bạn, bạn có thể có ArrayList như sau

ArrayList<Question> qsList = new ArrayList<>();
qsList.add(new Question(1));
qsList.add(new Question(2));
qsList.add(new Question(3));

// intialize Bundle instance
Bundle b = new Bundle();
// putting questions list into the bundle .. as key value pair.
// so you can retrieve the arrayList with this key
b.putSerializable("questions", (Serializable) qsList);
Intent i = new Intent(CurrentActivity.this, NextActivity.class);
i.putExtras(b);
startActivity(i);

để có được danh sách mảng trong hoạt động tiếp theo

//get the bundle
Bundle b = getIntent().getExtras();
//getting the arraylist from the key
ArrayList<Question> q = (ArrayList<Question>) b.getSerializable("questions");

2
//arraylist/Pojo you can Pass using bundle  like this 
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle args = new Bundle();
                        args.putSerializable("imageSliders",(Serializable)allStoriesPojo.getImageSliderPojos());
                        intent.putExtra("BUNDLE",args);
 startActivity(intent); 


Get SecondActivity like this
  Intent intent = getIntent();
        Bundle args = intent.getBundleExtra("BUNDLE");
String filter = bundle.getString("imageSliders");

//Happy coding

2
    public class StructMain implements Serializable {
    public  int id;
    public String name;
    public String lastName;
}

đây là mặt hàng của tôi. triển khai Serializable và tạo ArrayList

ArrayList<StructMain> items =new ArrayList<>();

và đặt trong Gói

Bundle bundle=new Bundle();
bundle.putSerializable("test",items);

và tạo Ý định mới đưa Gói thành Ý định

Intent intent=new Intent(ActivityOne.this,ActivityTwo.class);
intent.putExtras(bundle);
startActivity(intent);

để nhận gói, hãy chèn mã này

Bundle bundle = getIntent().getExtras();
ArrayList<StructMain> item = (ArrayList<StructMain>) bundle.getSerializable("test");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.