質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1317閲覧

Android Studio)RecyclerViewでnotifyItemChangedが起きない

navesanta

総合スコア198

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/10/09 05:54

ArrayListの中身をRecyclerViewに表示するアプリを作っています。Listをタップした時、
dialogが開いて指定した行のデータを変更する処理(changeAtPosition)とデータを削除する処理(removeAtPosition)を
KujiAdapterに設置しました。

changeAtPositionとremoveAtPositionにはアクションが発生した時にRecyclerViewを更新するように
notifyItemChangedとnotifyItemRemovedを設置しました。

テストrunするとremoveAtPositionは問題なく「データが1行なくなって再表示」をするのですが
changeAtPositionは「データが変わって再表示」する挙動がおきません。なぜか再表示されず変わりません。

・ArrayListの中身を確認すると変更されています。
・他のActivityに行って戻ってくると変わっています。

ネットで検索しましたがRecyclerViewのnotifyItemChangedに関しての情報は少なく該当するものを
見つけることができませんでした。

どういった要因が考えれられるでしょうか?ヒントありましたらよろしくお願いします。

環境 os mac
開発環境 Android studio 2.2.3

KujiAdapter.java

public class KujiAdapter extends RecyclerView.Adapter<KujiViewHolder> { private AlertDialog alertDialog; public Context context; private ArrayList<DataType> arrayList; private int tabNumber; public KujiAdapter(Context context, ArrayList<DataType> arrayList, int tabNumber) { this.context = context; this.arrayList = arrayList; this.tabNumber = tabNumber; } private ArrayList<DataType> lot1Array = new ArrayList<>(); private ArrayList<DataType> lot2Array = new ArrayList<>(); @Override public KujiViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from( parent.getContext()).inflate(R.layout.card_layout, parent, false ); return new KujiViewHolder(view); } @Override public void onBindViewHolder(final KujiViewHolder holder, final int listposition) { final EditText editText = new EditText(holder.base.getContext()); final EditText editNum = new EditText(holder.base.getContext()); final Editable lotText = editText.getText(); final Editable lotNum = editNum.getText(); holder.kujiContents.setText(arrayList.get(listposition).getKuji_contents()); holder.kujiNumber.setText(arrayList.get(listposition).getKuji_number()); holder.base.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(holder.base.getContext()); if (alertDialog == null) { LinearLayout layout = new LinearLayout(holder.base.getContext()); layout.setOrientation(LinearLayout.VERTICAL); TextView conponentText = new TextView(holder.base.getContext()); conponentText.setText(holder.base.getContext().getString(R.string.change_result)); conponentText.setHint(R.string.change_result_input); layout.addView(conponentText); layout.addView(editText); TextView numText = new TextView(holder.base.getContext()); numText.setText(holder.base.getContext().getString(R.string.change_num)); numText.setHint(R.string.change_num_input); layout.addView(numText); layout.addView(editNum); alertDialogBuilder .setTitle(holder.base.getContext().getString(R.string.change_result)) .setView(layout) .setPositiveButton(holder.base.getContext().getString(R.string.save_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (editText.length() == 0 | editNum.length() == 0) { Toast.makeText(holder.base.getContext(), "noting", Toast.LENGTH_SHORT).show(); } else { switch (tabNumber) { case 0: lot1Array = PrefManager.loadDataList(holder.base.getContext(), "lot1Array"); changeAtPosition(listposition, lot1Array, "lot1Array", lotText, lotNum); break; case 1: lot2Array = PrefManager.loadDataList(holder.base.getContext(), "lot2Array"); changeAtPosition(listposition, lot2Array, "lot2Array", lotText, lotNum); break; } } } }) .setNeutralButton("remove", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (tabNumber){ case 0: removeAtPosition(listposition,arrayList, "lot1Array"); break; case 1: removeAtPosition(listposition,arrayList, "lot2Array"); break; } } }) .setNegativeButton(holder.base.getContext().getString(R.string.cancel_button), null); alertDialog = alertDialogBuilder.create(); alertDialog.show(); } alertDialog.show(); } }); } public void changeAtPosition(int listPosition, ArrayList<DataType> arrayList,String key, Editable lotText, Editable lotNum){ arrayList.set(listPosition,new DataType(lotText.toString(),lotNum.toString())); notifyItemChanged(listPosition); PrefManager.saveDataList(context,key,arrayList); } public void removeAtPosition(int listPosition, ArrayList<DataType> arrayList, String key){ arrayList.remove(listPosition); notifyItemRemoved(listPosition); PrefManager.saveDataList(context,key,arrayList); } @Override public int getItemCount() { return arrayList.size(); } }

MainActivity.java

public class MainActivity extends AppCompatActivity { private AlertDialog alertDialog; private ArrayList<DataType> lot1Array; private ArrayList<DataType> lot2Array; //タブFlag private int tabNumber = 0; private ArrayList<DataType> defaultArray; RecyclerView recyclerView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.cardList); recyclerView.setHasFixedSize(true); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); lot1Array = PrefManager.loadDataList(getApplicationContext(),"lot1Array"); lot2Array = PrefManager.loadDataList(getApplicationContext(),"lot2Array"); } //ArrayListの初期値設定して保存 if (lot1Array.isEmpty()){ Log.d("UAA:isempty", String.valueOf(lot1Array.isEmpty())); initArray(lot1Array); initArray(lot2Array); PrefManager.saveDataList(getApplicationContext(),"lot1Array", lot1Array); PrefManager.saveDataList(getApplicationContext(),"lot2Array", lot2Array); } //既にデータがあるので lot1Array = PrefManager.loadDataList(getApplicationContext(),"lot1Array"); IndicateArray(lot1Array, tabNumber); Log.d("UAA:default2", String.valueOf(defaultArray)); Log.d("UAA:lot1", String.valueOf(lot1Array)); } //Arraylistを表示するメソッド public void IndicateArray(ArrayList<DataType> defaultArray, int tabNumber){ RecyclerView.Adapter adapter = new KujiAdapter(this,defaultArray,tabNumber); recyclerView.setAdapter(adapter); // recyclerView.setItemAnimator(null); recyclerView.addItemDecoration(new DividerItemDecoration(this)); adapter.notifyDataSetChanged(); } //Arraylistを初期化するメソッド public void initArray(ArrayList<DataType> lotArray){ String[] contentData = { this.getString(R.string.setting_first), this.getString(R.string.setting_second) }; String[] numberData = { "1", "3" }; for (int i = 0; i < contentData.length ; i++){ String kuji_contents = contentData[i]; String kuji_number = numberData[i]; lotArray.add(new DataType( kuji_contents, kuji_number )); } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Adapterが表示しているのは、次のリストです。

java

1private ArrayList<DataType> arrayList;

しかし、changeAtPosition()をadapterに表示されているのとは全く関係のないlot1Array, lot2Arrayに対して使っていますので、変更が反映されていません。

どの配列を表示したいのかがわからないので、具体的な解決策を提示できていませんが、うまく動かない理由は上記です。

投稿2017/10/09 12:20

編集2017/10/09 12:22
hiramekun

総合スコア428

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

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

navesanta

2017/10/09 22:56

ご指摘いただいた通りです。いただいた回答を何度も読み返して理解してlot1Arrayの部分をarraylistに修正したところうまく反映されました。ありがとうございました。これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問