実現したいこと
Android StudioでRecyclerViewを使用してリストを作成しています。
リストのアイテムを押すとCalenderViewに画面遷移できるように修正したいです。
intentで画面遷移を試みています
前提
エラーメッセージは出ておらず、アプリが落ちることもありません。
リストのアイテムを押しても反応がなく、困っています
activity_main.xmlのtourokuボタンを押してactivity_touroku.xmlに遷移しています
下記のコードはその後の処理です
該当のソースコード
TourokuActivity.java
1package com.example.furaheal; 2import android.content.DialogInterface; 3import android.content.Intent; 4import android.os.Bundle; 5import android.view.View; 6import android.widget.EditText; 7import androidx.annotation.NonNull; 8import androidx.appcompat.app.AppCompatActivity; 9import androidx.recyclerview.widget.RecyclerView; 10import androidx.recyclerview.widget.LinearLayoutManager; 11import androidx.recyclerview.widget.ItemTouchHelper; 12import androidx.recyclerview.widget.ItemTouchHelper.SimpleCallback; 13import android.app.AlertDialog; 14import android.content.DialogInterface; 15import android.widget.EditText; 16import android.widget.Toast; 17import java.util.ArrayList; 18import java.util.Collections; 19public class TourokuActivity extends AppCompatActivity { 20 // データ格納用のList 21 private ArrayList<String> arrayList; 22 23 private SamAdapter adapter; 24 25 ItemTouchHelper itemTouchHelper; 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_touroku); 30 // データ準備 31 arrayList = new ArrayList<>(); 32 33 RecyclerView recyclerView = (RecyclerView)findViewById(R.id.mainList); 34 LinearLayoutManager layoutManager = new LinearLayoutManager(this); 35 36 layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 37 38 recyclerView.setLayoutManager(layoutManager); 39 adapter = new SamAdapter(arrayList); 40 recyclerView.setAdapter(adapter); 41 42 adapter.setOnItemClickListener(new View.OnClickListener() { 43 @Override 44 public void onClick(View v) { 45 int position = recyclerView.getChildAdapterPosition(v); 46 47 // クリックされたアイテムのデータを取得 48 String clickedItem = arrayList.get(position); 49 50 // 別のActivityに遷移するためのIntentを作成し、データを渡す 51 Intent intent = new Intent(TourokuActivity.this, CalenderActivity.class); 52 intent.putExtra("item", clickedItem); 53 startActivity(intent); 54 55 } 56 }); 57 58 59 60 // ドラッグアンドドロップで移動 61 itemTouchHelper = new ItemTouchHelper( 62 new SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN , 63 ItemTouchHelper.LEFT){ 64 @Override 65 public boolean onMove(@NonNull RecyclerView recyclerView, 66 @NonNull RecyclerView.ViewHolder viewHolder, 67 @NonNull RecyclerView.ViewHolder target) { 68 final int fromPos = viewHolder.getAdapterPosition(); 69 final int toPos = target.getAdapterPosition(); 70 Collections.swap(arrayList, fromPos, toPos); 71 adapter.notifyItemMoved(fromPos, toPos); 72 return true; 73 } 74 // スワイプで削除 75 @Override 76 public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { 77 // アイテムを削除 78 arrayList.remove(viewHolder.getAdapterPosition()); 79 // 削除したことを通知 80 adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); 81 } 82 }); 83 // ItemTouchHelper を RecyclerView にアタッチ 84 itemTouchHelper.attachToRecyclerView(recyclerView); 85 86 87 } 88 89 90 // 「+」フローティング操作ボタンがタップされたときに実行される 91 public void onAddItem(View view) { 92 AlertDialog.Builder builder = new AlertDialog.Builder(this); 93 builder.setTitle("名前を設定"); 94 95 final EditText input = new EditText(this); 96 input.setHint("名前を入力してください"); 97 builder.setView(input); 98 99 // ダイアログの追加ボタンが押されたときの処理 100 builder.setPositiveButton("追加", new DialogInterface.OnClickListener() { 101 @Override 102 public void onClick(DialogInterface dialog, int which) { 103 String newName = input.getText().toString(); 104 if (!newName.isEmpty()) { 105 arrayList.add(newName); 106 adapter.notifyItemInserted(arrayList.size() - 1); 107 } 108 } 109 }); 110 111 // ダイアログのキャンセルボタンが押されたときの処理 112 builder.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() { 113 @Override 114 public void onClick(DialogInterface dialog, int which) { 115 dialog.cancel(); 116 } 117 }); 118 119 // ダイアログを表示 120 builder.show(); 121 } 122 123}
SamAdapter.java
1package com.example.furaheal; 2 3import android.content.Intent; 4import android.text.Editable; 5import android.text.TextWatcher; 6import android.view.View; 7import android.view.ViewGroup; 8import android.view.LayoutInflater; 9import android.view.MotionEvent; 10import android.widget.EditText; 11import android.widget.ImageButton; 12import android.annotation.SuppressLint; 13import android.widget.LinearLayout; 14import android.widget.TextView; 15 16import androidx.annotation.NonNull; 17import androidx.recyclerview.widget.RecyclerView; 18 19import com.example.furaheal.CalenderActivity; 20 21 22import java.util.List; 23 24public class SamAdapter extends RecyclerView.Adapter<SamAdapter.SampViewHolder>{ 25 26 private static List<String> arrayList; 27 private static TourokuActivity activity; 28 private View.OnClickListener listener; 29 30 // アダプターのコンストラクタ 31 SamAdapter(List<String> arrayList) { 32 this.arrayList = arrayList; 33 } 34 35 // ビューホルダーを生成 36 @NonNull 37 @Override 38 public SampViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 39 40 41 42 // レイアウトファイルに対応したViewオブジェクトを生成 43 View view = LayoutInflater.from(parent.getContext()) 44 .inflate(R.layout.row_main, parent, false); 45 46 // TourokuActivityを取得 47 activity = (TourokuActivity) parent.getContext(); 48 49 // ビューホルダーを生成してreturn 50 return new SampViewHolder(view); 51 } 52 53 // ビューホルダーにデータを割り当てる 54 @SuppressLint("ClickableViewAccessibility") 55 @Override 56 public void onBindViewHolder(SampViewHolder holder, int position) { 57 58 // TextViewにデータを設定 59 holder.text_contents.setText(arrayList.get(position)); 60 61 // テキストウォッチャーリスナーが既にあれば削除 62 if (holder.textWatcher != null) { 63 holder.text_contents.removeTextChangedListener(holder.textWatcher); 64 } 65 // テキストウォッチャーを設定 66 holder.textWatcher = createEditTextWatcher(holder); 67 holder.text_contents.addTextChangedListener(holder.textWatcher); 68 69 // 移動ボタンをタッチ 70 holder.btn_move.setOnTouchListener(new View.OnTouchListener(){ 71 @Override 72 public boolean onTouch(View v, MotionEvent event) { 73 if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 74 // 長押しではなく、タッチしてすぐにドラッグ状態にする 75 activity.itemTouchHelper.startDrag(holder); 76 return true; 77 } 78 return v.onTouchEvent(event); 79 } 80 }); 81 82 // 削除ボタンをクリック 83 holder.btn_del.setOnClickListener(new View.OnClickListener() { 84 @Override 85 public void onClick(View view) { 86 int adapterPosition = holder.getAdapterPosition(); 87 if (adapterPosition != -1) { 88 arrayList.remove(adapterPosition); 89 notifyItemRemoved(adapterPosition); 90 } 91 } 92 }); 93 94 holder.getLinearLayout().setOnClickListener(new View.OnClickListener() { 95 @Override 96 public void onClick(View view) { 97 listener.onClick(view); 98 } 99 }); 100 101 102 103 104 } 105 106 @Override 107 public int getItemCount() { 108 return arrayList.size(); 109 } 110 111 // ビューホルダー 112 public static class SampViewHolder extends RecyclerView.ViewHolder { 113 114 // ビューに配置されたウィジェットへの参照を保持しておくためのフィールド 115 public TextView text_contents; 116 public ImageButton btn_move; 117 public ImageButton btn_del; 118 private final LinearLayout linearLayout; 119 120 // テキストウォッチャー 121 public TextWatcher textWatcher; 122 private SampViewHolder viewHolder; 123 TextView textView; 124 125 126 127 128 129 // ビューホルダーのコンストラクタ 130 public SampViewHolder(View view) { 131 super(view); 132 133 // ウィジェットへの参照を取得 134 text_contents = (TextView) view.findViewById(R.id.text_contents); 135 btn_move = (ImageButton) view.findViewById(R.id.btn_move); 136 btn_del = (ImageButton) view.findViewById(R.id.btn_del); 137 linearLayout = (LinearLayout) view.findViewById(R.id.listLinearLayout); 138 139 140 141 viewHolder = this; 142 143 144 textView = itemView.findViewById(R.id.text_contents); 145 146 } 147 148 public LinearLayout getLinearLayout() { 149 return linearLayout; 150 } 151 152 153 } 154 155 // テキストウォッチャー 156 private TextWatcher createEditTextWatcher(final SampViewHolder viewHolder) { 157 return new TextWatcher() { 158 @Override 159 public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 160 161 @Override 162 public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 163 164 // 入力されたら、List内のデータを更新 165 @Override 166 public void afterTextChanged(Editable editable) { 167 arrayList.set(viewHolder.getAdapterPosition(), editable.toString()); 168 } 169 }; 170 } 171 172 public void setOnItemClickListener(View.OnClickListener listener) { 173 this.listener = listener; 174 } 175}
試したこと
SamAdapterのOnclickの部分を変えたりしています。
補足情報(FW/ツールのバージョンなど)
android studio 言語はjava
APIレベル28で実行しています
文字数制限の関係でimport分は省略しています。

回答1件
あなたの回答
tips
プレビュー