🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

5192閲覧

Listviewの更新処理の方法

kitarou

総合スコア8

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2019/09/17 17:45

Android Studio で開発をしているのですが、1つ解決できない問題があり、ご質問したい次第です。
言語はKotlinです。

実現したいことは、渡したい値を今いるActivity(showActivity)からIntentで渡して、それを次のActivity(resultActivity)のListviewで表示することで、
その際、渡した値(listの項目)をListviewに追加したり、削除したいです。

そこでわからないことは、どこのクラスで項目の更新(追加)処理をすればいいのかということです。
今の動きとしては、showActivityから送った値は次のActivityのListの最初に表示されますが、
そのActivityから再度別のActivityに遷移して、再び showActivityから値を渡すと前回の値は消えていて、今回の値だけ表示される状態です。
"name","time","id"の値をまとめて保存してリストに保存、更新したいです。
遷移先のActivityの、
** //保存
mproductPickupadapter.notifyDataSetChanged()**
でリストの更新ができてると思っていましたが、上手くいっていません。

コレクションを直接操作する時は、アダプターの notifyDataSetChanged メソッドを使用すればいいと考えているのですが、
渡す側で、リストにして保存してそれを渡すのか、または渡された方で作成したリストに、もらった値を入れて保存すればいいのか、、また、その値をアプリにちゃんと保存する場合、sharedPrefarenceなどで別の処理で値を保存すればいいのかも悩んでいるので、
もし気が付いた点などありましたら、教えて頂けると幸いです。

値の送り元のshowActivity

pickupbtn.setOnClickListener { //apiの取得データから必要なものをリストに保存  渡して保存したいデータ intent.putExtra("name",product_subject) intent.putExtra("time",pickup_datetime) intent.putExtra("id",itemcode) val products_pickupitem = arrayListOf<product_pickup>() //listに追加 products_pickupitem.add(product_pickup(product_subject,pickup_datetime,itemcode)) startActivity(intent) }

送信先で、Listviewを表示するActivity

import android.content.Context import android.content.Intent import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_products__pick_up.* import android.content.SharedPreferences class Products_PickUpActivity : AppCompatActivity() { lateinit var intent_name :String lateinit var intent_time :String lateinit var intent_id :String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_products__pick_up) //お気に入り保存処理 var data_stock: SharedPreferences = getSharedPreferences("DataSave", Context.MODE_PRIVATE) val intent_index = Intent(this,Webview_indexActivity::class.java) //intentの受け取り val intent = intent intent_name = intent.getStringExtra("name") intent_time = intent.getStringExtra("time") intent_id = intent.getStringExtra("id") val array = arrayListOf<product_pickup>() val array_add = array.add(product_pickup(intent_name,intent_time,intent_id)) //更新 var edit = data_stock.edit() edit.putString("pickupdata", array_add.toString()) //保存 edit.apply() //intentの受け取り val products_pickupitem = arrayListOf<product_pickup>() //listに追加 val mproductPickupadapter = product_pickupAdapter(this,products_pickupitem) products_pickupitem.add(product_pickup(intent_name,intent_time,intent_id)) //保存 mproductPickupadapter.notifyDataSetChanged() product_pickuplist.adapter = mproductPickupadapter val intent_itemcode = Intent(this, webview_showActivity::class.java) intent_itemcode.putExtra("itemcode",intent_id ) //スタートボタン product_pickuplist.setOnItemClickListener{ _, view, position, id -> startActivity(intent_itemcode) } //戻るボタン backbtn.setOnClickListener { startActivity(intent_index) } } override fun onResume() { super.onResume() }

Adaspterのクラス

class product_pickupAdapter(val context: Products_PickUpActivity, val items: ArrayList<product_pickup>): BaseAdapter() { private var mlayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater private var mContext: Context? = null private var mArraylist: ArrayList<product_pickup>? = null init { mContext = context mlayoutInflater = LayoutInflater.from(context) mArraylist = items } private class ViewHolder { var mname: TextView? = null var mdate: TextView? = null } override fun getCount(): Int { return mArraylist!!.count() } override fun getItem(position: Int): product_pickup { return mArraylist!![position] } override fun getItemId(position: Int): Long { return mArraylist!![position].name.toLong() } //xmlのviewのとidで紐付け override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { var contextView = convertView var holder: product_pickupAdapter.ViewHolder if (contextView == null){ contextView = mlayoutInflater?.inflate(R.layout.products_pickup_item,parent,false) holder = ViewHolder() holder.mname = contextView!!.findViewById<View>(R.id.name) as TextView holder.mdate = contextView!!.findViewById<View>(R.id.date) as TextView contextView.tag = holder }else{ holder = contextView.tag as ViewHolder } contextView = mlayoutInflater.inflate(R.layout.products_pickup_item, parent, false) holder.mname = contextView!!.findViewById<View>(R.id.name) as TextView holder.mdate = contextView!!.findViewById<View>(R.id.date) as TextView holder.mname!!.text = mArraylist!!.get(position)?.name holder.mdate!!.text = mArraylist!!.get(position)?.time contextView.tag = holder return contextView }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どこのクラスで項目の更新(追加)処理をすればいいのか

仕様次第です.
ご質問では3つのアクティビティの連鎖(showActivity → Products_PickUpActivity → webview_showActivity?) が登場しますが, どのアクティビティがそのリストの全データを管理する責任を負うのでしょう.
それによってアクティビティ間でどのデータを渡し, どこで保存するのかも決まると思います.

//保存 mproductPickupadapter.notifyDataSetChanged()
でリストの更新ができてると思っていました

notifyDataSetChanged は「(リストに設定された)アダプタの内容が変更されたことをリストに伝える」メソッドです.
保存ではありませんし, リストに設定されていない状態では実行は無意味ですし, 設定すれば内部で実行されます.

アプリにちゃんと保存する場合、sharedPrefarenceなどで別の処理で値を保存すればいいのか

リストに設定しただけでは, アクティビティが破棄されれば当然無くなります.
何に保存するかは仕様次第です.

投稿2019/09/18 05:40

jimbe

総合スコア13202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kitarou

2019/09/19 06:44

回答ありがとうござます。 >リストに設定しただけでは, アクティビティが破棄されれば当然無くなります 理解しました。 どのActivityに保存するかは自由に決められるので、showActivityで保存したいと思います。 リストの全データを保存するActivityを決めないといけないとすると、リストを表示するProducts_PickUpActivityが適当でないかと思います。  アドバイスを元に実装を進めていきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問