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

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

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

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

Android Studio

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

Q&A

解決済

1回答

1056閲覧

Adapterで設定したクリックイベントで画面遷移する方法が分からない

Aies

総合スコア21

Java

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

Android Studio

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

0グッド

0クリップ

投稿2019/02/02 04:44

編集2019/02/02 05:50

Adapterに設定したクリックリスナの中にonClickがあるのですが,いま書いてあるようなIntentの遷移はAdapterだと継承関係で使えないのでどう遷移すればいいのでしょうか?DailyDataにadapterのリスナが動いた時に動くonClickメソッドを作ることができればできそうなのですが、調べてもわからなかったのでよろしければご助言お願いいたします。

Java

1DailyAdapter 2 3@Override 4 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 5 View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell, parent, false); 6 final ViewHolder holder = new ViewHolder(inflate, viewType); 7 8 // クリックリスナを搭載 9 inflate.setOnClickListener(new View.OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 final int position = holder.getAdapterPosition(); // positionを取得 13 TextView hideDate = v.findViewById(R.id.hideDate); 14 String date = hideDate.getText().toString(); 15 Intent intent = new Intent(getApplication(), DailyData.class); 16 intent.putExtra("CalendarID", date); 17 startActivity(intent); 18 } 19 }); 20 return holder; 21 }

Java

1DailyData 2 3public class DailyData extends AppCompatActivity { 4 5 private KakeiboDatabase kDB; 6 private RecyclerView mRecyclerView; 7 private RecyclerView.Adapter mAdapter; 8 String date; 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_daily_data); 14 findViewById(R.id.hideDate).setVisibility(View.INVISIBLE); 15 16 kDB = new KakeiboDatabase(getApplicationContext()); 17 18 mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView); 19 DailyAdapter dailyAdapter = new DailyAdapter(this.createDataset()); 20 21 LinearLayoutManager llm = new LinearLayoutManager(this); 22 23 mRecyclerView.setHasFixedSize(true); 24 mRecyclerView.setLayoutManager(llm); 25 mRecyclerView.setAdapter(dailyAdapter); 26 27 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), 28 new LinearLayoutManager(getApplication()).getOrientation()); 29 mRecyclerView.addItemDecoration(dividerItemDecoration); 30 } 31 32 private ArrayList<Daily> createDataset() { 33 34 Intent intent = getIntent(); 35 date = intent.getStringExtra("CalendarID"); 36 37 ArrayList<Daily> dataset = new ArrayList<>(); 38 39 SQLiteDatabase db = kDB.getReadableDatabase(); 40 41 Cursor cursor = db.query( 42 "kakeibodb", 43 new String[] {"category", "memo", "price"}, 44 "date=?", 45 new String[] {date}, 46 null, 47 null, 48 null); 49 boolean next = cursor.moveToFirst(); 50 51 if(next) { 52 Daily title = new Daily(); 53 title.setCategory("カテゴリ"); 54 title.setMemo("メモ"); 55 title.setPrice("金額"); 56 dataset.add(title); 57 } 58 59 60 while (next) { 61 Daily daily = new Daily(); 62 // 取得したカラムの順番(0から始まる)と型を指定してデータを取得する 63 daily.setCategory(cursor.getString(0));// categoryを取得 64 daily.setMemo(cursor.getString(1));// memoを取得 65 daily.setPrice(String.valueOf(cursor.getInt(2)));// priceを取得 66 67 // 次の行が存在するか確認 68 next = cursor.moveToNext(); 69 dataset.add(daily); 70 } 71 cursor.close(); 72 73 return dataset; 74 } 75}

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

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

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

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

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

jimbe

2019/02/02 05:45

「Intentの遷移が使えない」とはどういう状態とお考えでしょうか. 「 onClick を通って(=実行して)いるけれども Intent に設定しているのに遷移しない」なのか. そもそも「 onClick を通っていない」なのか, です. 私には(コードから)後者に見えるのですが, クリックした際に onClick() を通っていることを確認されていますか?
Aies

2019/02/02 05:50 編集

extendsでAppCompatActivityやFragmentを継承していないとIntentが使えなかったと思うので、書いてあるものの使えないという状態です。すみません追記しておきます。 positionの取得は確認しているのでAdapter内にあるonClickはちゃんと動きます。
jimbe

2019/02/02 06:03

了解しました. DailyAdapter に startActivity が無いのでどうすればいいか, ということですね.
Aies

2019/02/02 06:05

はい。言葉足らずで申し訳ないです。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

DailyData で startActivity を行うのであれば, DailyAdapter に DailyData を渡せばよいことになります. が, やりたいことは startActivity だけなので, 仰る通り「リスナが動いた時に動くonClickメソッド」の構造を作ります. つまり, DailyData と繋がったリスナを作成・登録して, onClick 時にそれを呼び出します.
ということで, 以下のコードを書いてみました.
断片なのでコンパイルもしていませんので, このまま書くとコンパイルエラーがあるかもしれません.
イメージだけでも伝わると良いのですが.

アダプタから呼び出すリスナを用意します.

java

1interface DailyListClickListener { 2 public void onDailyListClick(String date); 3}

DailyAdapter に DailyListClickListener型の変数を作り, コンストラクタで受け取ります

java

1(before) 2public DailyAdapter(List<Daily> dataset) { 3 () 4} 5 6(after) 7private DailyListClickListener dailyListClickListener; 8 9public DailyAdapter(List<Daily> dataset, DailyListClickListener dailyListClickListener) { 10 this.dailyListClickListener = dailyListClickListener; 11 () 12}

DailyAdapter の onClick から DailyListClickListener.onDailyListClick を呼ぶようにし

java

1public void onClick(View v) { 2 final int position = holder.getAdapterPosition(); // positionを取得 3 TextView hideDate = v.findViewById(R.id.hideDate); 4 String date = hideDate.getText().toString(); 5 //Intent intent = new Intent(getApplication(), DailyData.class); 6 //intent.putExtra("CalendarID", date); 7 //startActivity(intent); 8 dailyListClickListener.onDailyListClick(date); 9}

DailyData の onCreate 内での DailyAdapter の生成パラメータにリスナを無名として追加します.

java

1(before) 2DailyAdapter dailyAdapter = new DailyAdapter(this.createDataset()); 3 4(after) 5DailyAdapter dailyAdapter = new DailyAdapter(this.createDataset(), 6 new DailyListClickListener(){ 7 public void onDailyListClick(String date) { 8 Intent intent = new Intent(getApplication(), DailyData.class); 9 intent.putExtra("CalendarID", date); 10 startActivity(intent); 11 } 12 });

DailyAdapter の生成位置なら Activity 内なので startActivity が使えると思いますが, 如何でしょうか.

投稿2019/02/02 06:33

編集2019/02/02 08:43
jimbe

総合スコア12612

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

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

Aies

2019/02/02 09:32

できました!全然思いつかなかった方法だったので勉強になりました。ありがとうございました。
jimbe

2019/02/02 10:36

よかったです, おめでとうございます. 今回は使う前提なのでアダプタのコンストラクタでリスナを渡す形に致しましたが, コンストラクタで無くメソッドで, 例えば setOnDailyListClickListener() という設定メソッドを作って呼ぶ形にすると, View.setOnClickListener(new View.OnClickListener() {~}); と似た形になってシステムとの一体感が出るかと思います. また, このようなオブジェクト間の構造・関係の形式は「デザインパターン」としてオブジェクトの生成方法からプログラム全体の構造まで知られているパターンがありますので, 興味がありましたら探してみては如何かと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問