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

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

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

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

Android

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

Q&A

解決済

2回答

10039閲覧

AndroidのListViewにて、List上に配置したボタンのイベントを取得したい。

lereve

総合スコア12

Java

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

Android

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

0グッド

1クリップ

投稿2018/03/15 01:06

編集2018/03/19 00:07

前提・実現したいこと

[前提]
趣味でプログラムを触ったことがある程度の初心者です。
質問内容はあまりに根本的な内容になるかとは思いますが、
参考本やHPに書かれている内容ではなかなか理解できず困っています。
是非、ご教授いただきたく思います。

[実現したいこと]
Androidの画面上にListViewを配置し、それぞれの行にTextViewとButtonを配置、
このButtonが押された時の処理を書きたいと思っています。(チェックリストのイメージです。)

発生している課題

参考書やHPを参考にし、コードを写経してみたものの、ボタンのイベントが取得できておりません。

現在クラスは3つあり、いつものMainActivityと
ListViewの各項目用のListItemクラス、
ArrayAdapterを継承したListAdapterクラスがあります。

各項目の場所を把握したい(〇列目のOKボタンが押された、など)のですが、
こういった場合はどこにどのような処理を書けばいいのでしょうか。

よろしくお願いします。

追記・修正

MainActivityのコードがListViewのコードになってしまっていました。
訂正しました。
申し訳ありませんでした。

ListAdapter のgetViewメソッド内にリスナーが抜けておりましたので追加しましたところ、
Button okButton =(Button) convertView.findViewById(R.id.ok_Button);
の部分でぬるぽが発生します。

画面写真

イメージ説明

コード

MainActivity

Java

1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 // レイアウトからリストビューを取得 9 ListView listView = (ListView)findViewById(R.id.listview); 10 11 // リストビューに表示する要素を設定 12 ArrayList<ListItem> listItems = new ArrayList<>(); 13 for (int i = 0; i < 30; i++) { 14 ListItem item = new ListItem(i + 1, "sample text", 0); 15 listItems.add(item); 16 } 17 18 // 出力結果をリストビューに表示 19 ListAdapter adapter = new ListAdapter(this, R.layout.list_item, listItems); 20 listView.setAdapter(adapter); 21 22 // タップ時のイベントを追加 23 listView.setOnItemClickListener(onItemClickListener); 24 25 } 26 27 private AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() { 28 @Override 29 public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 30 Toast.makeText(MainActivity.this, "テスト", Toast.LENGTH_LONG).show(); 31 32 // タップしたアイテムの取得 33 ListView listView = (ListView)parent; 34 ListItem item = (ListItem)listView.getItemAtPosition(position); // ListItemにキャスト 35 36 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 37 builder.setTitle("Tap No. " + String.valueOf(position)); 38 builder.setMessage(item.getQuestionContent()); 39 builder.show(); 40 } 41 }; 42 43}

ListItem

Java

1public class ListItem { 2 private int mQuestionNumber = 0; 3 private String mQuestionContent = ""; 4 private int mStatus = 0; 5 6 public ListItem(int questionNumber, String questionContent, int status){ 7 mQuestionNumber = questionNumber; 8 mQuestionContent = questionContent; 9 mStatus = status; 10 } 11 12 public void setQuestionNumber(int questionNumber){ 13 mQuestionNumber = questionNumber; 14 } 15 16 public void setQuestionContext(String questionContext){ 17 mQuestionContent = questionContext; 18 } 19 20 public void setStatus(int status){ 21 mStatus = status; 22 } 23 public int getQuestionNumber(){ 24 return mQuestionNumber; 25 } 26 public String getQuestionContent(){ 27 return mQuestionContent; 28 } 29 public int getStatus(){ 30 return mStatus; 31 } 32 33} 34

ListAdapter

Java

1public class ListAdapter extends ArrayAdapter<ListItem> { 2 3 private int mResource; 4 private List<ListItem> mItems; 5 private LayoutInflater mInflater; 6 7 public ListAdapter(Context context, int resource, List<ListItem> items){ 8 super(context, resource, items); 9 10 mResource = resource; 11 mItems = items; 12 mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 13 14 } 15 16 @Override 17 public View getView(int position, View convertView, ViewGroup parent) { 18 View view; 19 20 if (convertView != null) { 21 view = convertView; 22 } 23 else { 24 view = mInflater.inflate(mResource, null); 25 } 26 27 // リストビューに表示する要素を取得 28 ListItem item = mItems.get(position); 29 30 Button okButton =(Button) convertView.findViewById(R.id.ok_Button); 31 okButton.setOnClickListener(new OK_Listener()); 32 33 Button ngButton =(Button) convertView.findViewById(R.id.ng_Button); 34 ngButton.setOnClickListener(new NG_Listener()); 35 36 Button noneButton =(Button) convertView.findViewById(R.id.none_Button); 37 noneButton.setOnClickListener(new NONE_Listener()); 38 39 Button commentButton =(Button) convertView.findViewById(R.id.comment_Button); 40 commentButton.setOnClickListener(new Comment_Listener()); 41 42 // QuestionNumberに番号を設定 43 TextView questionNumber = (TextView)view.findViewById(R.id.questionNumber); 44 questionNumber.setText(Integer.toString(item.getQuestionNumber())); 45 46 // QuestionContextに番号を設定 47 TextView questionContext = (TextView)view.findViewById(R.id.questionContext); 48 questionContext.setText(item.getQuestionContent()); 49 50 return view; 51 } 52 //okボタンのリスナー 53 class OK_Listener implements View.OnClickListener { 54 public void onClick(View v){ 55 Log.v("**********", "OK_Button"); 56 } 57 } 58 59 //ngボタンのリスナー 60 class NG_Listener implements View.OnClickListener { 61 public void onClick(View v){ 62 Log.v("**********", "NG_Button"); 63 } 64 } 65 66 //noneボタンのリスナー 67 class NONE_Listener implements View.OnClickListener { 68 public void onClick(View v){ 69 Log.v("**********", "NONEK_Button"); 70 } 71 } 72 73 //commentボタンのリスナー 74 class Comment_Listener implements View.OnClickListener { 75 public void onClick(View v){ 76 Log.v("**********", "Comment_Button"); 77 } 78 } 79}

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

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

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

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

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

kakajika

2018/03/15 15:03

MainActivityのところにListAdapterのソースコードが貼られているようなので、正しいものに変更していただけますか?
lereve

2018/03/18 23:44

kakajika様 ご指摘いただきありがとうございます。質問文を訂正いたしました。よろしくお願いします。
guest

回答2

0

ベストアンサー

MainActivity側でイベントを受け取りたいパターンを想定して回答いたします。

まず、今回のようなケースではAndroid標準のリスナーだけでやろうとすると少々不足する部分があるので、自分でリスナーを定義して通知の仕組みを実装されることをオススメします。

欲しいデータは ◯列目の〜ボタン ですから、それをイメージしてリスナーを定義してみましょう。ボタンが何のボタンであるかの判定には、Viewのidを使います。

java

1// 定義の例 2interface ListItemButtonClickListener { 3 public void onItemButtonClick(int position, View view); 4}

このリスナーをListAdapterの生成時に渡すようにして、各ボタンのクリック時にリスナーの onItemButtonClick を呼び出すことでイベントを知らせることができます。

java

1// 実装例(関係ないところは省略しています) 2public class ListAdapter extends ArrayAdapter<ListItem> { 3 4 private ListItemButtonClickListener mListener; 5 6 public ListAdapter(Context context, int resource, List<ListItem> items, ListItemButtonClickListener listener){ 7 ... 8 mListener = listener; 9 } 10 11 // OnClickListener内で使うためにpositionはfinal intにする 12 @Override 13 public View getView(final int position, View convertView, ViewGroup parent) { 14 View view; 15 16 ... 17 18 view.findViewById(R.id.ok_Button).setOnClickListener(new View.OnClickListener() { 19 public void onClick(View v){ 20 // onButtonClickを呼び出してmListenerにイベントを知らせる(以下同様) 21 mListener.onItemButtonClick(position, v) 22 } 23 }); 24 25 view.findViewById(R.id.ng_Button).setOnClickListener(new View.OnClickListener() { 26 public void onClick(View v){ 27 mListener.onItemButtonClick(position, v) 28 } 29 }); 30 31 view.findViewById(R.id.done_Button).setOnClickListener(new View.OnClickListener() { 32 public void onClick(View v){ 33 mListener.onItemButtonClick(position, v) 34 } 35 }); 36 37 view.findViewById(R.id.comment_Button).setOnClickListener(new View.OnClickListener() { 38 public void onClick(View v){ 39 mListener.onItemButtonClick(position, v) 40 } 41 }); 42 43 ... 44 return view; 45 } 46}

あとは、MainActivity側で ListItemButtonClickListener を実装してListAdapterの生成時に渡してあげればOKです。

java

1// 実装例 2ListAdapter adapter = new ListAdapter(this, R.layout.list_item, listItems, new ListItemButtonClickListener() { 3 public void onItemButtonClick(int position, View view) { 4 switch (view.getId()) { 5 case R.id.ok_button: 6 // OKボタンが押された時の処理(以下同様) 7 break; 8 case R.id.ng_button: 9 break; 10 case R.id.done_button: 11 break; 12 case R.id.comment_button: 13 break; 14 } 15 } 16});

投稿2018/03/19 04:07

kakajika

総合スコア3131

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

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

lereve

2018/03/19 04:14

kakajika様 自分でリスナーを定義…そういう方法もありましたね! 意図する動作を実現させることが出来ました。 大変参考になりました。 ありがとうございました。
guest

0

ArrayAdapterのgetviewでボタンの定義をしてないからじゃないですか?

自分も初心者なんでよくわかりませんが、

https://qiita.com/maromaro3721/items/6ac3cba4f090662adabf

だとやってるけどあなたのやつにはないので...

投稿2018/03/16 13:57

rainysk

総合スコア27

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

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

lereve

2018/03/19 00:02

rainysk様 ご指摘ありがとうございます。getView内に Button okButton =(Button) convertView.findViewById(R.id.ok_Button); okButton.setOnClickListener(new OK_Listener()); を追加し、 //okボタンのリスナー class OK_Listener implements View.OnClickListener { public void onClick(View v){ Log.v("**********", "OK_Button"); } } を追加しましたところ、 Button okButton =(Button) convertView.findViewById(R.id.ok_Button); の部分でぬるぽが出るようです。
kakajika

2018/03/19 04:09

`convertView` はnullになっている可能性がありますから、convertViewがnullかどうかをチェックしてnullなら新規にinflateしている `view` に対してfindViewByIdを呼ぶようにしましょう。
lereve

2018/03/19 04:17

kakajika様 convertViewについての知識量が浅すぎたようです。 ぬるぽが出るならnullかどうかチェックすればいい、ところまでは自己調査でわかったのですがその後どこにfindViewByIdすればよいかわからず、こちらも大変ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問