【问题标题】:Pass ArrayList<? implements Parcelable> to Activity通过 ArrayList<?实现 Parcelable> 到 Activity
【发布时间】:2013-02-28 10:28:31
【问题描述】:

我搜索了一些主题,但没有找到解决问题的方法。

public class Series implements Parcelable {
private String name;
private int numOfSeason;
private int numOfEpisode;

/** Constructors and Getters/Setters have been removed to make reading easier **/

public Series(Parcel in) {
    String[] data = new String[3];
    in.readStringArray(data);
    this.name = data[0];
    this.numOfSeason = Integer.parseInt(data[1]);
    this.numOfEpisode = Integer.parseInt(data[2]);
}


@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeStringArray(new String[] { this.name,
            String.valueOf(this.numOfSeason),
            String.valueOf(this.numOfEpisode) });

}

private void readFromParcel(Parcel in) {
    name = in.readString();
    numOfSeason = in.readInt();
    numOfEpisode = in.readInt();
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    @Override
    public Series createFromParcel(Parcel in) {
        return new Series(in);
    }

    @Override
    public Series[] newArray(int size) {
        return new Series[size];
    }
};

}

在我的 MainActivity 中,我有一个 ArrayList。为了使列表动态可编辑,我需要将它传递给另一个我可以编辑它的活动。

ArrayList<Series> listOfSeries = new ArrayList<Series>();

    public void openAddActivity() {
    Intent intent = new Intent(this, AddActivity.class);
    intent.putParcelableArrayListExtra(
            "com.example.episodetracker.listofseries",
            (ArrayList<? extends Parcelable>) listOfSeries);
    startActivity(intent);
}

我需要转换列表,否则 Eclipse 会给我以下错误消息。 Intent类型中的putParcelableArrayListExtra(String, ArrayList)方法不适用于参数(String, List)

这是正确的做法吗?

    ArrayList<Series> list = savedInstanceState
            .getParcelableArrayList("com.example.episodetracker.listofseries");

这是我尝试在另一个活动中读取数据的方式。

它在上面一行崩溃了。即 getParcelableArrayList 部分。

【问题讨论】:

  • 1/ 我不明白在您的代码中什么不起作用。 2/你不把列表保存在某个地方吗?因此,最好在数据库上工作而不是在你从一个活动传递到另一个活动的数组上工作吗?
  • Parcelables 可以说是魔鬼......你试过让它序列化吗?
  • 我的印象是 Parcelable 是要走的路,因为 Serializable 要慢很多?
  • Parcelable 让复杂类变得更容易。就速度而言,我们在谈论多少数据条目?
  • 一个包含约 10 个条目的 ArrayList,其中每个条目有 3 个内存变量。

标签: android arraylist parcelable


【解决方案1】:
  • 问题在于写入包裹并从包裹中读取......

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(numOfSeason);
        dest.writeInt(numOfEpisode);
    }
    
    private void readFromParcel(Parcel in) {
        name = in.readString();
        numOfSeason = in.readInt();
        numOfEpisode = in.readInt();
    }
    
  • 你写出的内容必须与你读入的内容相匹配......

    @Override
     protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    Intent i = new Intent(this,SecondActivity.class);
    
    ArrayList<testparcel> testing = new ArrayList<testparcel>();
    
    i.putParcelableArrayListExtra("extraextra", testing);
    startActivity(i);
    }
    
        /**********************************************/
    
    
    public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra");
     }
    }
    
  • 上面的代码具有来自两个不同活动的 onCreate()。第一个启动第二个;它工作正常我能够毫无问题地拉出包裹。

【讨论】:

  • 已更改。但是 NullPointerException 仍然存在。尽管 `ArrayList list = savedInstanceState .getParcelableArrayList("com.example.episodetracker.listofseries");` 没有改变这部分的任何内容
  • 捆绑包中的名称并不重要,您可以将其称为“MyArray”作为键,它应该可以工作。它在哪条线上崩溃了?
  • 在我在新活动中“加载”的行上崩溃。特别是这一行: ArrayList list = savedInstanceState .getParcelableArrayList("com.example.episodetracker.listofseries");`
  • 您必须从意图而不是 savedInstanceState 调用
  • 我绕了一个小时转了一圈...除了订单外一切都很完美...
【解决方案2】:

您应该在Intent 类上使用putParcelableArrayListExtra() 方法。

【讨论】:

  • intent.putParcelableArrayListExtra( "com.example.episodetracker.listofseries", (ArrayList&lt;? extends Parcelable&gt;) listOfSeries); 这是正确的做法吗?如果我不强制转换,我会收到以下错误:Intent 类型中的方法 putParcelableArrayListExtra(String, ArrayList extends Parcelable>) 不适用于参数 (String, List)
  • 将您的listOfSeries 声明为ArrayList 而不是List
  • 好吧,这让编译器很高兴。但是,一旦我尝试读取数据,程序仍然会崩溃。我已经用 logcat sn-p 更新了原始帖子。
【解决方案3】:

我使用了来自Bundle 对象的putParcelableArrayList(&lt;? extends Parcelable&gt;)。不是直接来自意图对象。(我真的不知道有什么区别)。但我习惯用这种方式:

ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>();
resultSet = loadData();

Bundle data = new Bundle();
data.putParcelableArrayList("search.resultSet", resultSet);
yourIntent.putExtra("result.content", data);
startActivity(yourIntent);

稍后在您的新活动中,您可以填充最近插入到 Bundle 对象中的数据,如下所示:

Bundle data = this.getIntent().getBundleExtra("result.content");
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset");

请记住,您的ArrayList&lt;&gt; 必须只包含可打包的对象。并且只是为了确保您已经传递了数据,您可以检查接收到的数据是否为空,以避免出现问题。

【讨论】:

    【解决方案4】:

    也许这对某人有帮助.. 否则我的问题是我使用了 write 和 readValue 但它应该匹配 writeInt、readInt、writeString、readString 等类型

    【讨论】:

      【解决方案5】:

      我是这样做的:

      var intent = Intent(this@McqActivity,ResultActivity::class.java)
      intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList)) 
      // resultList  is of type mutableListOf<ResultBO>()  
       startActivity(intent)
      

      为了使 class Parcelable 。我只是简单地做two operation,首先我在我的数据类上方使用了@Parcelize Annotation,然后我用Parcelable 继承它,如下所示..

      import kotlinx.android.parcel.Parcelize
      import android.os.Parcelable
      
      @Parcelize // Include Annotion 
      data class ResultBO(val questionBO: QuestionBO) : Parcelable {
          constructor() : this(QuestionBO())
      }
      

      在接收端

      if (intent != null) {
           var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
      }
      

      【讨论】:

        【解决方案6】:

        你可以通过 Parcelable ArrayList

        发件人活动 ->

        startActivity(Intent(this, SenderActivity::class.java).apply { putExtra("getList",list)})

        接收者活动 ->

        private lateinit var list: ArrayList&lt;List&gt;

        list = this.intent.extras?.getParcelableArrayList("getList")!!

        你会得到列表中的所有 Arraylist。

        【讨论】:

          猜你喜欢
          • 2015-03-17
          • 1970-01-01
          • 2011-10-25
          • 1970-01-01
          • 1970-01-01
          • 2020-03-27
          • 2021-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多