質問するログイン新規登録
Java

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

Android Studio

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

Q&A

解決済

1回答

1315閲覧

Android StudioでRecyclerViewを使ってリストのアイテムを押して画面遷移がしたい

meielle_08

総合スコア2

Java

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

Android Studio

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

0グッド

1クリップ

投稿2023/06/12 01:27

編集2023/06/12 05:39

0

1

実現したいこと

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分は省略しています。

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

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

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

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

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

jimbe

2023/06/12 03:20

>文字数制限の関係でimport分は省略 連続する空白行やコードの英語をそのまま日本語に訳したような意味の無いコメントを無くしたり、インテンントをスペース2つにするとかで思ったより文字数が減ったりします。
guest

回答1

0

ベストアンサー

継ぎ接ぎと思われるコードの乱れがあちこちにあります。もう少し整理されたほうが良いでしょう。(以下のコードも勿論完全ではありませんが。)
レイアウトが分からないのでコードからテキトウに生成しています。

TourokuActivity.java

java

1import androidx.annotation.NonNull; 2import androidx.appcompat.app.*; 3import androidx.recyclerview.widget.*; 4 5import android.content.*; 6import android.os.Bundle; 7import android.widget.EditText; 8 9import com.google.android.material.floatingactionbutton.FloatingActionButton; 10 11public class TourokuActivity extends AppCompatActivity { 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_touroku); 16 17 RecyclerView recyclerView = (RecyclerView) findViewById(R.id.mainList); 18 SamAdapter adapter = new SamAdapter(clickedItem -> { 19 Intent intent = new Intent(this, CalenderActivity.class); 20 intent.putExtra("item", clickedItem); 21 startActivity(intent); 22 }); 23 recyclerView.setAdapter(adapter); 24 25 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) { 26 // 長押しで移動 27 @Override 28 public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { 29 final int fromPos = viewHolder.getAdapterPosition(); 30 final int toPos = target.getAdapterPosition(); 31 adapter.move(fromPos, toPos); 32 return true; 33 } 34 // スワイプで削除 35 @Override 36 public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { 37 adapter.remove(viewHolder.getAdapterPosition()); 38 } 39 }); 40 itemTouchHelper.attachToRecyclerView(recyclerView); 41 42 adapter.setOnTouchListener(viewHolder -> { 43 itemTouchHelper.startDrag(viewHolder); 44 return true; 45 }); 46 47 FloatingActionButton fab = findViewById(R.id.fab); 48 fab.setOnClickListener(v -> { 49 final EditText input = new EditText(this); 50 input.setHint("名前を入力してください"); 51 52 new AlertDialog.Builder(this) 53 .setTitle("名前を設定") 54 .setView(input) 55 .setPositiveButton("追加", (dialog, which) -> { 56 String newName = input.getText().toString(); 57 if(!newName.isEmpty()) adapter.add(newName); 58 }) 59 .setNegativeButton("キャンセル", (dialog, which) -> dialog.cancel()) 60 .show(); 61 }); 62 } 63}

res/layout/activity_touroku.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".TourokuActivity"> 8 9 <androidx.recyclerview.widget.RecyclerView 10 android:id="@+id/mainList" 11 android:layout_width="0dp" 12 android:layout_height="0dp" 13 app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintEnd_toEndOf="parent" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18 19 <com.google.android.material.floatingactionbutton.FloatingActionButton 20 android:id="@+id/fab" 21 android:layout_marginEnd="50dp" 22 android:layout_marginBottom="50dp" 23 android:layout_width="wrap_content" 24 android:layout_height="wrap_content" 25 android:src="@android:drawable/ic_input_add" 26 android:contentDescription="add item" 27 app:layout_constraintBottom_toBottomOf="parent" 28 app:layout_constraintEnd_toEndOf="parent" /> 29</androidx.constraintlayout.widget.ConstraintLayout>

SamAdapter.java

java

1import android.util.Log; 2import android.view.*; 3import android.widget.*; 4 5import androidx.annotation.NonNull; 6import androidx.recyclerview.widget.*; 7 8import java.util.*; 9 10public class SamAdapter extends RecyclerView.Adapter<SamAdapter.SampViewHolder> { 11 private static final String LOG_TAG = "SamAdapter"; 12 13 interface OnClickListener { 14 void onClick(String str); 15 } 16 interface OnTouchListener { 17 boolean onTouch(RecyclerView.ViewHolder viewHolder); 18 } 19 20 private List<String> nameList = new ArrayList<>(); 21 private OnClickListener clickListener; 22 private OnTouchListener touchListener; 23 24 SamAdapter(@NonNull OnClickListener listener) { 25 this.clickListener = listener; 26 } 27 void setOnTouchListener(OnTouchListener touchListener) { 28 this.touchListener = touchListener; 29 } 30 31 void add(String newName) { 32 Log.d(LOG_TAG, "newName=" + newName); 33 nameList.add(newName); 34 notifyItemInserted(nameList.size() - 1); 35 } 36 void remove(int position) { 37 nameList.remove(position); 38 notifyItemRemoved(position); 39 } 40 void move(int fromPos, int toPos) { 41 Collections.swap(nameList, fromPos, toPos); 42 notifyItemMoved(fromPos, toPos); 43 } 44 45 @NonNull 46 @Override 47 public SampViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 48 return new SampViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row_main, parent, false)); 49 } 50 51 @Override 52 public void onBindViewHolder(SampViewHolder holder, int position) { 53 holder.name.setText(nameList.get(position)); 54 } 55 56 @Override 57 public int getItemCount() { 58 return nameList.size(); 59 } 60 61 class SampViewHolder extends RecyclerView.ViewHolder { 62 private TextView name; 63 private ImageButton btn_move, btn_del; 64 65 SampViewHolder(View itemView) { 66 super(itemView); 67 name = itemView.findViewById(R.id.name); 68 btn_move = itemView.findViewById(R.id.btn_move); 69 btn_del = itemView.findViewById(R.id.btn_del); 70 71 itemView.setOnClickListener(view -> clickListener.onClick(nameList.get(getAdapterPosition()))); 72 73 btn_move.setOnTouchListener((v, event) -> { 74 if(event.getActionMasked() == MotionEvent.ACTION_DOWN && touchListener != null) { 75 return touchListener.onTouch(SampViewHolder.this); 76 } 77 return v.onTouchEvent(event); 78 }); 79 80 btn_del.setOnClickListener(view -> remove(getAdapterPosition())); 81 } 82 } 83}

res/layout/row_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 android:layout_width="match_parent" 5 android:layout_height="wrap_content" 6 android:clickable="true"> 7 8 <TextView 9 android:id="@+id/name" 10 android:layout_width="0dp" 11 android:layout_height="wrap_content" 12 android:text="text" 13 android:textSize="30dp" 14 app:layout_constraintEnd_toStartOf="@id/btn_move" 15 app:layout_constraintStart_toStartOf="parent" 16 app:layout_constraintTop_toTopOf="parent" /> 17 18 <ImageButton 19 android:id="@+id/btn_move" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" 22 android:src="@android:drawable/star_on" 23 app:layout_constraintEnd_toStartOf="@id/btn_del" 24 app:layout_constraintTop_toTopOf="parent"/> 25 <ImageButton 26 android:id="@+id/btn_del" 27 android:layout_width="wrap_content" 28 android:layout_height="wrap_content" 29 android:src="@android:drawable/ic_delete" 30 app:layout_constraintEnd_toEndOf="parent" 31 app:layout_constraintTop_toTopOf="parent"/> 32</androidx.constraintlayout.widget.ConstraintLayout>

投稿2023/06/12 05:26

jimbe

総合スコア13357

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

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

meielle_08

2023/06/12 05:53

回答ありがとうございます。無事にエラーなく成功できました! わかりやすいコードを書けるように勉強に勤しみたいと思います。 本当にありがとうございました。
jimbe

2023/06/12 17:22 編集

TextWatcher がありましたが RecyclerView の行の TextView は入力できないので削除しました。恐らく元は EditText で、直接入力するような感じだったのでしょう。 ダイアログによって入力する形の場合は、 TextWatcher を使って入力がある時だけ "追加" ボタンを有効にする(=入力が無い場合は無効にする)という使い道があります。 ついでに、 Dialog をそのまま使うとダイアログを表示した状態で画面を回転させたりするとダイアログが消えてしまいます。 DialogFragment を使うようにすると回転させてもダイアログが表示された状態を維持出来ます。 (まぁ現状ではアダプタ内のデータを保存していないので、回転させるとデータが消えちゃいますが。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問