Можно ли хранить данные из двух разных классов данных для продажи в одном единственном намерении, чтобы начать новую Activitiy с ним? - PullRequest
0 голосов
/ 20 сентября 2019

после многих исследований я не смог найти реальное решение для моей проблемы.Большинство ответов основаны на присоединении одного объекта к цели и начала нового действия с него.

В моем случае я использую данные из двух разных классов, которые можно продать.У меня есть два разных класса RecyclerView Adapter, которые живут в одном и том же упражнении.

Итак, когда пользователь щелкает набор данных из первого (родительского) класса Adapter, в представлении отображаются все доступные (дочерние) наборы данных извторой класс адаптера.

Я хочу сохранить набор данных родительского объекта, в котором пользователь щелкнул первым, а также дочерний объект, в котором пользователь, наконец, выполнил длинный щелчок.Оба объекта должны быть присоединены к одному и тому же назначению, и когда это будет сделано, должно быть начато новое действие.Данные от обоих объектов (родительского и дочернего) должны быть переданы в новой форме.

Ради ясности я публикую только соответствующие части кода.

Это часть родительского класса адаптера, в которой мне нужно сохранить данные объекта в своего рода «глобальном» намерении, вместо этого мой код будет генерировать только локальное намерение (поэтому оно только закомментировано).

                itemView.setOnClickListener {
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onHeadItemClicked(weKopf.WENR, p1)
                // save parent parcelable object data to "global" intent 
                // val intent = Intent(context, StorageGoodsActivity::class.java)
                // intent.putExtra("weKopf", weKopf)

            }

Вот часть кода, в которой я хочу присоединить данные дочернего объекта к тому же намерению, а затем начать новое действие.

                itemView.setOnLongClickListener{
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onPositionLongClicked(wePos.lfdNr.toInt())
                /**
                 * setting-up for passing objects between activities
                 */
                val intent = Intent(context, StorageGoodsActivity::class.java)
                //intent.putExtra("weKopf", weKopf)
                intent.putExtra("wePos", wePos)
                context.startActivity(intent)
                true

Какой самый элегантный способ сделать это?Моя идея заключалась в том, чтобы сохранить намерение в общем компоненте, но это намерение должно сохраняться до тех пор, пока пользователь нажимает кнопку «Назад», чтобы вернуться к старому действию, и после этого выбирает новое родительско-дочернее созвездие.Если да, то будет ли этот созданный предмет выброшен или он все еще живет в общем компоненте?

Я довольно новичок в Android Studio и Kotlin, и я ценю любую помощь или совет.Огромное спасибо заранее.

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Вы можете иметь столько дополнений, сколько захотите в Intent, при условии, что у каждого будет свое имя.Единственным ограничением является ограничение на общий размер намерения (около 2 МБ iirc).

0 голосов
/ 24 сентября 2019

Решением этой проблемы была небольшая работа вокруг.Невозможно было присоединить объекты данных из обоих классов адаптеров к одному и тому же назначению, поскольку новое действие можно запустить только с одного адаптера.В этом случае я передал объект данных из первого (родительского) адаптера в объект SharedPreferences, объект был преобразован с помощью Gson в его представление JSON.

itemView.setOnClickListener {
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onHeadItemClicked(weKopf.WENR, p1)

                /**
                 * store object in SharedPreferences
                 */
                val sharedPreferences:SharedPreferences = context.getSharedPreferences("StoreHeadObj", MODE_PRIVATE)
                val editor : SharedPreferences.Editor = sharedPreferences.edit()
                val gson = Gson()
                val json = gson.toJson(weKopf)

                editor.putString("JSONString", json)
                editor.commit()

Второй (дочерний) объект был переданнамерение и новое действие было начато.

itemView.setOnLongClickListener{
                notifyItemChanged(selectedPos)
                selectedPos = adapterPosition
                notifyItemChanged(selectedPos)
                listener.onPositionLongClicked(wePos.lfdNr.toInt())
                /**
                 * setting-up for passing objects between activities
                 */                
                val intentPos = Intent(context, StorageGoodsActivity::class.java)                
                intentPos.putExtra("wePos",wePos)
                context.startActivity(intentPos)

                true
}

В новом действии я извлекаю данные из обоих объектов.Прежде всего, я преобразую строку JSON в объект данных, после чего я извлекаю данные из намерения.Таким образом, оба объекта данных, которые можно продать, теперь готовы к использованию в новом действии.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getContentView())

        /**
         * get data from clicked weKopf-Object using Gson, at the end clear SharedPreferences
         */
        val sharedPreferences:SharedPreferences = getSharedPreferences("StoreHeadObj", Context.MODE_PRIVATE)
        val gson = Gson()
        val json:String = sharedPreferences.getString("JSONString", "")
        val weKopf:WeKopf = gson.fromJson(json, WeKopf::class.java)
        /**
         * get data from long-clicked wePos-Object using Intent
         */
        val extras = getIntent().getExtras()
        val wePos = extras.getParcelable<WePos>("wePos")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...