前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/20 12:52
2019/08/20 16:18 編集
2019/08/20 17:30 編集
2019/08/21 13:26 編集