Метод getParcelableExtra () возвращает ноль при создании намерения - PullRequest
0 голосов
/ 08 декабря 2018

У меня проблема с созданием намерения и передачей объекта с помощью метода getParcelableExtra ().Целью проекта является создание представления переработчика.Если выбран элемент из утилизатора, начинается новое намерение, в котором должны отображаться более подробные данные.

Поскольку данные извлекаются из внешней базы данных MySQL, я использую Volley для большинства сетевых операций.

Утилизатор реализован внутри метода Volley onResponse (), который сначала вызывается взапуск приложения (onCreate).До этого момента все работает нормально, и утилита загрузки загружается и отображается правильно.

public class UserAreaActivity extends AppCompatActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_area);

    initializeRecycler();
}

    public void initializeRecycler() {

    operations.getFoodFromDB(getFoodID(), new IDatabaseOperations() {
        @Override
        public void onSuccess(final ArrayList<Food> food_list) {

            mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            mLayoutmanager = new LinearLayoutManager(UserAreaActivity.this);
            mAdapter = new FoodAdapter(food_list);
            mRecyclerView.setLayoutManager(mLayoutmanager);
            mRecyclerView.setAdapter(mAdapter);

            mAdapter.setOnItemClickListener(new FoodAdapter.OnItemClickListener() {
                @Override
                public void OnItemClick(int position) {
                    Intent intent = new Intent(UserAreaActivity.this, FoodProfile.class);
 GETS CORRECT OBJECT----->intent.putExtra("food", food_list.get(position));
                    startActivity(intent);
                }
            });

        }
    });

}

}

Как вы видите, я создал интерфейс для метода Volley onResponse, который называется onSuccess.Внутри этого метода я создаю onItemClickListener, и именно здесь он становится безобразным.OnItemClickListener открывает более детальное представление элемента, но метод getParcelableExtra () возвращает NULL.Что бы я ни делал, он никогда не возвращает объект класса Food.

public class FoodProfile extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(activity_food_profile);

    Food food = getIntent().getParcelableExtra("food");<----RETURNS NULL 


    String price = food.getPrice();
    String name = food.getName();
    String rating = ((Float)food.getRating()).toString();
    String imageRes = food.getmimgId();


    TextView mPrice = (TextView) findViewById(R.id.Price);
    mPrice.setText(price);
    TextView mName = (TextView) findViewById(R.id.Name);
    mName.setText(name);
    TextView mRating = (TextView) findViewById(R.id.Rating);
    mRating.setText(rating);

}

}

Таким образом, метод putExtra () работает так, как задумано, и получает правильный объект класса пищи.Но getParcelableExtra () каждый раз возвращает NULL.Таким образом, никакое значение не отображается в начальном намерении.

Класс еды:

public class Food implements Parcelable {

public int id;
public String name;
public String category;
public String date;
public int vegan;
public int vegetarian;
public String price;
public String uuid;
public float rating;
public String mimgId;

public Food(int id, String name, String category, int vegan, int vegetarian, String price, String uuid, float rating, String mimgId){
    this.id = id;
    this.name = name;
    this.category = category;
    this.date = date;
    this.vegan = vegan;
    this.vegetarian = vegetarian;
    this.price = price;
    this.uuid = uuid;
    this.rating = rating;
    this.mimgId = mimgId;
}

protected Food(Parcel in) {
    id = in.readInt();
    name = in.readString();
    category = in.readString();
    date = in.readString();
    vegan = in.readInt();
    vegetarian = in.readInt();
    price = in.readString();
    uuid = in.readString();
    rating = in.readFloat();
    mimgId = in.readString();
}

public static final Creator<Food> CREATOR = new Creator<Food>() {
    @Override
    public Food createFromParcel(Parcel in) {
        return new Food(in);
    }

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

public int getId() {
    return id;
}

public String getName() {
    if(name != null) {
        name = name.replaceAll(System.getProperty("line.separator"), (""));
    }
    return name;
}

public String getDate() {
    return date;
}

public int isVegan() {
    return vegan;
}

public int isVegetarian() {
    return vegetarian;
}

public String getPrice() {
    return price;
}

public String getUuid() {
    return uuid;
}

public float getRating(){return rating;}

public String getmimgId() {
    return mimgId;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(price);
    dest.writeString(name);
    dest.writeString(((Float)rating).toString());
    dest.writeString(mimgId);

}
}

Кто-нибудь знает, что заставляет getParcelableExtra () возвращать ноль?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 09 декабря 2018

Как я уже говорил выше, writeToParcel() проблематично.Посылка должна быть написана и прочитана в том же порядке.

Пожалуйста, обратитесь к следующим страницам в качестве ссылки:

Что такое Parcelable в Android

Использование Parcelable

Основные понятия Android Parcelable - Учебное пособие

...