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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

2587閲覧

RecyclerView.AdapterでRecyclerView内のswitch変更時に並び順を変更する方法

jun74

総合スコア338

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2019/08/18 09:51

前提・実現したいこと

RecyclerView.AdapterでRecyclerView内のswitch変更時に並び順を変更する方法を知りたい。
switchがオンまたはオフになったときにRecyclerViewの上から順にキー比較を行い、移動したい行に移動するのが理想である。

該当のソースコード

java

1public class AlarmsAdapter extends RecyclerView.Adapter<AlarmsAdapter.ItemViewHolder> { 2 3 SQLiteDatabase mydb; 4 5 Context context; 6 7 private ArrayList<Integer> m_id; 8 private ArrayList<Boolean> m_sw_alarm; 9 private ArrayList<String> m_t_gozengogo; 10 private ArrayList<String> m_t_time; 11 private ArrayList<String> m_t_ampm; 12 private ArrayList<String> m_t_alarm_name; 13 private ArrayList<String> m_t_week; 14 15 public static class ItemViewHolder extends RecyclerView.ViewHolder { 16 17 public LinearLayout row_layout; 18 public Switch sw_alarm; 19 public TextView t_gozengogo; 20 public TextView t_time; 21 public TextView t_ampm; 22 public TextView t_alarm_name; 23 public TextView t_week; 24 public ImageButton ib_menu; 25 public ItemViewHolder(View v){ 26 super(v); 27 row_layout=(LinearLayout)v.findViewById(R.id.row_layout); 28 sw_alarm = (Switch)v.findViewById(R.id.sw_alarm); 29 t_gozengogo = (TextView)v.findViewById(R.id.t_gozengogo); 30 t_time = (TextView)v.findViewById(R.id.t_time); 31 t_ampm = (TextView)v.findViewById(R.id.t_ampm); 32 t_alarm_name = (TextView)v.findViewById(R.id.t_alarm_name); 33 t_week = (TextView)v.findViewById(R.id.t_week); 34 ib_menu = (ImageButton)v.findViewById(R.id.ib_menu); 35 36 } 37 } 38 39 public AlarmsAdapter(ArrayList<Integer> i_id, ArrayList<Boolean> i_sw_alarm, ArrayList<String> i_t_gozengogo, ArrayList<String> i_t_time, ArrayList<String> i_t_ampm, ArrayList<String> i_t_alarm_name, ArrayList<String> i_t_week){ 40 this.m_id = i_id; 41 this.m_sw_alarm = i_sw_alarm; 42 this.m_t_gozengogo = i_t_gozengogo; 43 this.m_t_time = i_t_time; 44 this.m_t_ampm = i_t_ampm; 45 this.m_t_alarm_name = i_t_alarm_name; 46 this.m_t_week = i_t_week; 47 } 48 49 @Override 50 public ItemViewHolder onCreateViewHolder( 51 ViewGroup parent, 52 int viewType){ 53 View v = LayoutInflater.from(parent.getContext()) 54 .inflate(R.layout.alarm_row, 55 parent, 56 false); 57 return new ItemViewHolder(v); 58 } 59 60 @Override 61 public void onBindViewHolder(final ItemViewHolder holder, final int position) { 62 //行の値設定 63 holder.sw_alarm.setChecked(m_sw_alarm.get(position)); 64 holder.t_gozengogo.setText(m_t_gozengogo.get(position)); 65 holder.t_time.setText(m_t_time.get(position)); 66 holder.t_ampm.setText(m_t_ampm.get(position)); 67 holder.t_alarm_name.setText(m_t_alarm_name.get(position)); 68 holder.t_week.setText(m_t_week.get(position)); 69 70 //アラームスイッチ変更 71 holder.sw_alarm.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 72 @Override 73 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 74 if(holder.sw_alarm.isChecked()) { 75 //mSwitch : Off -> On の時の処理 76 77 // コンテキスト取得 78 context = buttonView.getContext(); 79 //アラームスイッチ更新 80 alarm_switch_upd(holder.sw_alarm.isChecked() ,position); 81 } else { 82 //mSwitch : On -> Off の時の処理 83 84 // コンテキスト取得 85 context = buttonView.getContext(); 86 //アラームスイッチ更新 87 alarm_switch_upd(holder.sw_alarm.isChecked() ,position); 88 } 89 } 90 }); 91 } 92 93 @Override 94 public int getItemCount() { 95 return m_t_time.size(); 96 } 97 98 //アラームスイッチ更新 99 private void alarm_switch_upd(boolean i_sw_alarm ,int i_position) { 100 101 //リサイクルビューのスイッチ更新 102 m_sw_alarm.set(i_position , i_sw_alarm); 103 104 //dbオープン 105 MySQLiteOpenHelper helper = 106 new MySQLiteOpenHelper(context.getApplicationContext()); 107 try{ 108 mydb = helper.getWritableDatabase(); 109 }catch(SQLiteException e){ 110 //異常終了 111 return; 112 } 113 114 //アラームテーブルのスイッチ更新 115 String wk_switch = String.valueOf(m_sw_alarm.get(i_position)); 116 String update_table = "update alarm_table " + 117 "set switch = '" + wk_switch + "'" + 118 " where _id = " + m_id.get(i_position); 119 mydb.execSQL(update_table); 120 121 } 122 123}

試したこと

SortedListとRecyclerViewでちょっと幸せ
上記より、SortedListというのを見つけたが実装が大変そうであるため、別の手段を模索したい。
※SortedList用に全項目の定義など必要そう。

補足情報(FW/ツールのバージョンなど)

Android Studio3.4
API14から28対象でターゲットは28

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

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

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

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

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

guest

回答2

0

ベストアンサー

同一Activity再描画時にAndroid8だと右から左へ画面再描画となりチラつく からのフィードバックなのですが, 並び替えに関しまして以下のようなテストコードを作りました.
「//====」で囲った部分のような処理を onCheckedChanged で行うことで, 並び替えされると思います(そこまでは試していません).

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 List<RowData> list = new ArrayList<RowData>(); 6 //ソートの効果を確認のため, 初期値は順バラバラ 7 list.add(new RowData(true , 1)); 8 list.add(new RowData(true , 5)); 9 list.add(new RowData(false, 3)); 10 list.add(new RowData(true , 2)); 11 list.add(new RowData(false, 4)); 12 13 Collections.sort(list); 14 15 for(int i=0; i<list.size(); i++) System.out.println(list.get(i)); 16 System.out.println(); 17 18 //==== 19 RowData time4 = list.get(3); //このオブジェクトを操作してみる 20 21 System.out.println("time4 のスイッチを変更"); 22 System.out.println(); 23 time4.sw = true; 24 25 int from = list.indexOf(time4); //ソート前位置 26 Collections.sort(list); //再ソート 27 int to = list.indexOf(time4); //ソート後位置 28 29 for(int i=0; i<list.size(); i++) System.out.println(list.get(i)); 30 System.out.println(); 31 32 System.out.println("time4 は, "+from+" から "+to+" に移動した"); 33 //notifyItemMoved(from, to); 34 //==== 35 } 36 static class RowData implements Comparable { 37 boolean sw; 38 int time; 39 RowData(boolean sw, int time) { 40 this.sw = sw; 41 this.time = time; 42 } 43 //自然順序: sw=true が先, 同じなら time 降順 44 public int compareTo(Object other) { 45 if(!(other instanceof RowData)) 46 throw new IllegalArgumentException("other is not 'RowData'"); 47 RowData o = (RowData)other; 48 if(this.sw != o.sw) return o.sw ? 1 : -1; 49 return o.time - this.time; 50 } 51 // sw は同一条件には入らない 52 public boolean equals(Object other) { 53 if(other == null) return false; 54 if(!(other instanceof RowData)) return false; 55 RowData o = (RowData)other; 56 return this.time == o.time; 57 } 58 public String toString() { 59 return "[sw="+(sw?"t":"f")+",time="+time+"]"; 60 } 61 } 62}

plain

1[sw=t,time=5] 2[sw=t,time=2] 3[sw=t,time=1] 4[sw=f,time=4] 5[sw=f,time=3] 6 7time4 のスイッチを変更 8 9[sw=t,time=5] 10[sw=t,time=4] 11[sw=t,time=2] 12[sw=t,time=1] 13[sw=f,time=3] 14 15time4 は, 3 から 1 に移動した

投稿2019/08/20 05:14

jimbe

総合スコア12545

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

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

jun74

2019/08/20 12:52

いつもありがとうございます。 Activityから「RowData」として受け渡して表示、その後、ソートの順で試してみます。
jun74

2019/08/20 16:18 編集

Collections.sort(list); //再ソートについて、onCheckedChanged後に並び替えたデータを持つ Adapter を RecyclerView に setAdapter (再)表示するには、どのようにすれば良いのでしょうか? https://teratail.com/questions/207237 ※上記で質問を起こしました。 notifyDataSetChanged();で再描画しようとしてハマり中です。。 以下、初期表示で並び順が正しくなることまでは確認しました。 public AlarmsAdapter(ArrayList<AlarmData> i_AlarmList){ this.AlarmList = i_AlarmList; //リサイクルビューソート Collections.sort(AlarmList); }
jimbe

2019/08/20 17:30 編集

回答致しました. 少し要望と言いますか, 紹介といいますか, java ではクラス名は大文字, 変数名は小文字で始める等の指針/規約があります. [Java言語の命名指針]( https://qiita.com/rkonno/items/1b30daf83854fecbb814 ) ご自身の特別な拘りが無ければ, "AlarmList" は "alarmList" とされますと クラス名等と間違え難くなって読み易いです.
jun74

2019/08/21 13:26 編集

ありがとうございます。 無事、Activityから「RowData」として受け渡して表示、その後、ソートの順で実現できました。 Java言語の命名指針の件もありがとうございます! 早速参考にさせて頂きました。 今後、意識していきたいと考えます。
guest

0

RecyclerView.Adapterのnotify系メソッド 〜 notifyDataSetChangedで…いいの?

上記より、以下のコードで実現しました。

java

1notifyItemMoved(int fromPosition, int toPosition)

positionについて0から順にキーを比較して入れ替えるものになると考えます。

投稿2019/08/18 11:10

jun74

総合スコア338

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問