带有parcelable的EXTRA出现NULL但没有罚款

时间:2014-07-28 16:40:12

标签: android listview android-intent null parcelable

我对一个我似乎无法完全理解的问题感到有些沮丧。

我有一个包含项目的列表视图,当我点击它们时,我想将一个对象(Parcelable)传递给一个新活动。这是下面的代码:

lv_Entries.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent getItchesScreen = new Intent(Home.this, Itches.class);

            getItchesScreen.putExtra("i", 3);

            Entry e = entries.get(position);

            getItchesScreen.putExtra("entry", e);

            startActivity(getItchesScreen);
        }
    });

现在,我有了#34;我&#34;额外用于调试目的。我刚刚发送&#34; entry&#34;当我对活动有意图时,它没有工作。代码如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_itches);

    tv_date = (TextView) findViewById(R.id.tv_date);

    Bundle b = getIntent().getExtras();

    entry = b.getParcelable("entry");

    tv_date.setText(entry.getDate());

    itches = entry.getItches();

    itchesAdapter = new ItchAdapter(this, itches);

    ListView lv_Itches = (ListView) findViewById(R.id.lv_itches);

    lv_Itches.setAdapter(itchesAdapter);
}

因此,当我阅读我的包时,根本没有任何东西。没有&#34;进入&#34;钥匙,没有&#34;我&#34;键(我调试使用手表功能阅读i)

BUT!如果我不发送&#34;条目&#34;并且只发送&#34; i&#34;我调试以赶上&#34;我&#34;我明白了!

我不知道为什么发送条目会破坏事情,但我找不到任何答案。我调试了对象,它确实找到了.get(position)。

希望任何人都能给我任何想法,并为任何麻烦感到抱歉。

修改

以下是Entry的代码:

public class Entry implements Parcelable{

private String date;
private ArrayList<Itch> itches;

public Entry(String date){
    this.date = date;
    itches = new ArrayList<Itch>();
}

// PARCELABLE
public Entry(Parcel source){
    date = source.readString();
    source.readTypedList(itches, Itch.CREATOR);
}

public void AddItch(Itch itch){
    itches.add(itch);
}

// get intensity average for the itches
public int IntensityAverage(){

    int intensity = 0;

    for(Itch i : itches){
        intensity += i.getIntensity();
    }

    return intensity/itches.size();
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public ArrayList<Itch> getItches() {
    return itches;
}

public void setItches(ArrayList<Itch> itches) {
    this.itches = itches;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(date);
    dest.writeTypedList(itches);
}

public static final Parcelable.Creator<Entry> CREATOR =
    new Parcelable.Creator<Entry>() {
        public Entry createFromParcel(Parcel source) {
            return new Entry(source);
        }

        public Entry[] newArray(int size) {
            return new Entry[size];
        }
    };

}

Itch类也是Parceable。我正确填充了ListView(至少没有在Android上崩溃)。

为方便起见,我将代码放在这里:

public class Itch implements Parcelable{

private String time;
private String local;
private int intensity;

public Itch(String time, String local, int intensity){
    this.time = time;
    this.local = local;
    this.intensity = intensity;
}

// PARCELABLE
public Itch(Parcel source){
    time = source.readString();
    local = source.readString();
    intensity = source.readInt();
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}

public String getLocal() {
    return local;
}

public void setLocal(String local) {
    this.local = local;
}

public int getIntensity() {
    return intensity;
}

public void setIntensity(int intensity) {
    this.intensity = intensity;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(time);
    dest.writeString(local);
    dest.writeInt(intensity);
}

public static final Parcelable.Creator<Itch> CREATOR =
    new Parcelable.Creator<Itch>() {
        public Itch createFromParcel(Parcel source) {
            return new Itch(source);
        }

        public Itch[] newArray(int size) {
            return new Itch[size];
        }
    };

}

2 个答案:

答案 0 :(得分:3)

好吧......问题是什么?简单。

parcelable总是出现null的原因是因为发生了一个愚蠢的错误。哪个错误?

好吧,好吧,看看这段代码:

entry = b.getParcelable("entry");

这是什么意思?据说,参赛作品将等于可以参加的参赛作品#34;键。但这究竟意味着什么?查看入口构造函数。

// PARCELABLE
public Entry(Parcel source){
    date = source.readString();
    source.readTypedList(itches, Itch.CREATOR);
}

因此,当您说条目等于parcelable时,您将在我发布的Entry类中调用此构造函数。但为什么你可能会问这个错误呢?

嗯,好好看看。我们将ArrayList itches赋予方法readTypeList。但是......等一下。如果那是一个构造函数,意味着我们从0开始构建...那么...是否已启动?不它不是!因为我只是在&#34;正常&#34;构造!

public Entry(String date){
    this.date = date;
    itches = new ArrayList<Itch>();
}

所以解决方案是......

// PARCELABLE
public Entry(Parcel source){
    date = source.readString();

    //add this if condition!
    if (itches == null) {
        itches = new ArrayList<Itch>();
    }

    source.readTypedList(itches, Itch.CREATOR);
}

就是这样。这解决了我们的问题! :)

如果发生其他错误,请注意: 确保您的密钥正确无误。因此,请查看您获得额外内容的任何拼写错误。

entry = b.getParcelable("entyr");

代替

entry = b.getParcelable("entry");

还有其他任何类型的错误。

这不是一个好的实践,你应该有一个变量,其中包含&#34;条目&#34;写在上面,所以你永远不会有这种类型的错误。我在我的代码中有它,因为我正在快速编程以构建原型:)

快乐的编码!

答案 1 :(得分:-1)

您是否尝试在onCreate()

中执行此操作
Intent i = getIntent();
    if(i.hasExtra("entry")){
        entry = i.getParcelableExtra("entry");
    }else{
      Log.v("EXTRAS", "entry not found");
    }