Добавление данных класса данных в изменяемый список, который является параметром другого класса данных Kotlin Androidx - PullRequest
0 голосов
/ 04 апреля 2020

Моя функция addMeal ожидает ресторан / YelpRestaurant (который был ранее выбран пользователем .. см. Изображения)

Как передать выбранный ресторан в ?? Надеюсь, что это очень просто, и я обдумываю это

Это мой первый kotlin android проект, поэтому извиняюсь за глупость. Пользователь выбирает ресторан Пользователь решает добавить мысль для этого конкретного ресторана Пользователь нажимает кнопку, и мысль / UserMeal добавляется в список "блюд" выбранного ресторана

Классы данных ____

data class YelpSearchResult(
@SerializedName ("total") val total: Int,
@SerializedName ("businesses") val restaurants: List<YelpRestaurant>

)

класс данных YelpRestaurant (

val name: String,
val rating: Double,
val price: String,
@SerializedName("review_count") val numReviews: Int,
@SerializedName("image_url") val imageUrl: String,
val categories: List<YelpCategory>,
val location: YelpLocation,
val meals: MutableList<UserMeals> = ArrayList()

)

класс данных UserMeals (val mealName: String, val mealPrice: Double, val едыThoughts: String)

Меня интересует только список блюд и класс данных UserMeals

class ThoughtsActivity : AppCompatActivity() {

lateinit var mealName : String
lateinit var mealPrice : String
lateinit var mealThought : String
lateinit var addedMeal : UserMeals

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_thoughts)

    thoughtBtn.setOnClickListener() {

        mealName = m_name.text.toString()
        mealPrice = m_price.text.toString()
        mealThought = m_thought.text.toString()

        val addedMeal = UserMeals(mealName,mealPrice.toDouble(),mealThought)

        if(mealName.isNotEmpty()){
           addMeal()
        }

        val intent = Intent(this, RestaurantActivity::class.java)
        intent.putExtra("MEALNAME", mealName)
        intent.putExtra("PRICE", mealPrice)
        intent.putExtra("MEALTHOUGHT", mealThought)
    }
}

fun addMeal(restaurant: YelpRestaurant){
    restaurant.meals.add(addedMeal)
}

----- EDIT- ----

---- Моя активность для среднего экрана, где проходит ресторан ----

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_restaurant)

    val button = findViewById<Button>(R.id.addBtn)

//        rvThoughts.adapter = adapter
//        rvThoughts.layoutManager = LinearLayoutManager(this)

    button.setOnClickListener{
        val intent = Intent(this, ThoughtsActivity::class.java)
intent.putExtra("restaurantObject", <??>)
        startActivity(intent)
    }

    var intent = intent

    val aName = intent.getStringExtra("iName")
    val aRating = intent.getDoubleExtra("iRating",0.0)
    val aPrice = intent.getStringExtra("iPrice")
    val aReviews = intent.getStringExtra("iReviews")
    val aImageUrl = intent.getStringExtra("iImageUrl")
    val aCategory = intent.getStringExtra("iCategory")
    val aLocation = intent.getStringExtra("iLocation")



    r_name.text = aName
    r_reviews.text = aReviews
    r_rating.rating = aRating.toFloat()
    r_price.text = aPrice
    r_reviews.text = aReviews.toString()
    Glide.with(applicationContext).load(aImageUrl).into(r_image)
    r_category.text = aCategory
    r_address.text = aLocation


}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Что ж, у вас есть информация в середине активности прямо тогда, когда вы нажимаете кнопку «ДОБАВИТЬ МЫСЛИ», затем на слушателе, у которого вы создали намерение, затем помещаете туда пару ключ и значение ресторана, которая будет использоваться для получить ресторан в этом задании (ThoughtActivity).

Реализация Parcelable:

YelpRestaurant(...): Parcelable

в среднем упражнении (где у вас есть один пи c и информация о ресторане):

val intent = Intent(this, ThoughtsActivity::class.java)
intent.putExtra("restaurantObject", <your yelp restaurant object here>)

В onCreate от службы мышления у вас должен быть объект restaurant, а если нет, то вы создадите его, используя эти вещи (из намерения), вы отправите необработанную строку на средний уровень активности

Вместо отправки этих необработанных строк создайте объект Yelp Resuturant из этих данных в основном (первом) задании

//First activity
val restaurants = mutableListOf(YelpRestaurant(iName, iRating, ...), ...)

//and instead put the selected restaurant object
//example: view is that restaurant's object in selection activity
view.onClickListener {
    val intent = Intent(this@MainActivity, MiddleActivity::class.java)
    val restaurantSelected = restaurants.first {
        //get child of the view and get the restaurant's name, store as resName
        it.name == resName
    }

    intent.putExtra("restaurant_object", restaurantSelected)
    startActivity(intent)
}

Внутри вашего среднего занятия вместо извлечения всех этих строковых значений только получить ресторанный объект * 102 4 *

//not these
//    val aName = intent.getStringExtra("iName")
//    val aRating = intent.getDoubleExtra("iRating",0.0)
//    val aPrice = intent.getStringExtra("iPrice")
//    val aReviews = intent.getStringExtra("iReviews")
//    val aImageUrl = intent.getStringExtra("iImageUrl")
//    val aCategory = intent.getStringExtra("iCategory")
//    val aLocation = intent.getStringExtra("iLocation")

val restaurant = intent.getExtra("restaurant_object") as YelpRestaurant
//now send this object to next activity
0 голосов
/ 04 апреля 2020

Хорошо, я получил разъяснения по вашему вопросу,

** Обновление **

Добавьте в свой уровень gradle:

apply plugin: 'kotlin-android-extensions'

Затем в YelpRestaurant или что-то еще Объект, который вы хотите передать через намерение, заставляет их реализовать Parcelable и аннотировать Parcelize:

@Parcelize
data class YelpRestaurant(...) : Parcelable

Оттуда вы можете легко передавать объекты класса данных между намерениями. передавая их:

val intent: Intent = Intent(this, SecondActivity::class.java)
intent.putExtra("restaurant", YelpRestaurant("hey", "hello"));
startActivity(intent)

И затем извлекая их:

val intent: Intent = getIntent()
var yelresTaurant : YelpRestaurant = intent.getParcelableExtra("restaurant")

Это всего лишь пример с вашим YelpRestaurant (не рассматривал его объекты), но вы должны знать следующие шаги.

...