getParcelableArrayListExtra проблема. Сбой программы - PullRequest
0 голосов
/ 03 декабря 2011

Я пытаюсь передать массив объектов для нового действия, я следовал учебному пособию, и похоже, что я все сделал правильно, но моя программа продолжала падать.Я закомментировал большую часть кода, чтобы изолировать строку, которая, кажется, вызывает сбой, и ее бит getParcelableArrayListExtra, который, кажется, является проблемой.Кто-нибудь может помочь?

Новое действие:

public class DatabaseSearch extends ListActivity{
    DBAdapter db = new DBAdapter(this);
    ArrayList<String> listrecipes = new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.databasesearch);

        Intent i = getIntent();
        if (i != null) {
            ArrayList<mydata> data = i.getParcelableArrayListExtra ("com.example.MyPantry.array");
        }
    }
}

Бит кода из старого действия - я не знаю, имеет ли это значение, но новое действие вызывается в диалоговом окне

    @Override
protected Dialog onCreateDialog(int id)
{   

    switch(id) {
    case 0:
        return new AlertDialog.Builder(this)
        .setIcon(R.drawable.icon)
        .setTitle("List all recipes that match over:")
        .setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                // TODO Auto-generated method stub
                switch (item)
                {
                case 0:
                    percentageselected = 25;
                    break;
                case 1:
                    percentageselected = 50;
                    break;
                case 2:
                    percentageselected = 75;
                    break;
                case 3:
                    percentageselected = 100;
                    break;
                default:
                    break;
                }
            }
        })
        .setPositiveButton("OK", new
                DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,
                int whichButton)
                {
                    if (percentageselected == 0)
                    {
                        Toast.makeText(getBaseContext(), "Please make a selection", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        Intent intent = new Intent(getBaseContext(), DatabaseSearch.class);
                        intent.putParcelableArrayListExtra("com.example.MyPantry.array", array);
                        startActivity(intent);
                    }
                }
        })
        .setNegativeButton("Cancel", new
                DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, 
                    int whichButton)
            {
                dialog.dismiss();
            }
        })
        .create();

    }
    return null;
}

Мои объекты внутри массива, который я хочу передать -

public class mydata implements Parcelable {

private int recipeID;
private int ingredientID;
private String check = "unchecked";
private int percentage = 0;


@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel data, int flags) {
    // TODO Auto-generated method stub
      data.writeInt(recipeID);
      data.writeInt(ingredientID);
      data.writeString(check);
      data.writeInt(percentage);
}

    //Other functions
}

Наконец, у меня есть этот класс, который учебник дал мне указание сделать ...

public class MyCreator implements Parcelable.Creator<mydata> {
@Override
public mydata createFromParcel(Parcel source) {
    // TODO Auto-generated method stub
    return new mydata(source);
}

@Override
public mydata[] newArray(int arg0) {
    // TODO Auto-generated method stub
    return new mydata[arg0];
}

}

Так что я знаю, что на это немного, но я просто стараюсь быть тщательным.Проблема начинает возникать внутри оператора if в новом действии.

1 Ответ

0 голосов
/ 03 декабря 2011

При простой передаче данных между намерениями вы можете просто пометить ваши классы как Serializable (путем реализации интерфейса маркера Serializable) и добавить их непосредственно в намерение как дополнительные функции без необходимости выполнять всю эту работу с parcelable (parcelable действительно нужен толькопри привязке к службам).

Трудно сказать, почему вы получаете ошибку, не видя трассировки стека или конструктора для mydata, который заполняет класс с помощью Parcel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...