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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

686閲覧

ListVewのカラムをクリックしたイベントを拾う方法

Nooki

総合スコア20

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2022/09/17 17:02

編集2022/09/17 17:03

実現したいこと

ListViewのヘッダーのタイトルカラムをクリックしたらタイトルでソート、更新日時カラムをクリックしたら更新日時でソートしたいです。
イメージ説明

教えていただきたいこと

タイトルカラム、更新日時カラムそれぞれをクリックしたイベントを拾う方法を教えてください。

前提

■言語
Java
■割愛しているソースコードについて
下記のソースコードは割愛しています。
・AddEditMemo.java
MainActivityからの遷移先のソースコード
・TestOpenHelper.java
データベースを参照、更新する処理を実装。
・item.java
ListViewで表示するitemを作る処理を実装。

発生している問題・エラーメッセージ

onItemClick()でヘッダーをクリックしたイベントを拾うことはできるのですが、ヘッダーのどのカラムをクリックしたかを取得することができません。
そのため、タイトルでソートするのか、更新日時でソートするのかの判断ができません。

該当のソースコード

MainAcivity.java

1package com.example.memoapp_android 2 3import ... 4 5public class MainActivity extends AppCompatActivity 6 implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { 7 8 private TestOpenHelper helper; 9 private SQLiteDatabase db; 10 private ListViewAdapter adapter; 11 12 // 要素の削除、順番変更のためArrayListを定義 13 private List<String> itemNames; 14 private List<String> itemTimeStamps; 15 16 // タップされたitemの位置 17 private int tappedPosition = 0; 18 19 List<Item> memoDataList; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 26 if (helper == null) { 27 helper = new TestOpenHelper(getApplicationContext()); 28 } 29 30 memoDataList = helper.createMemoDataList(); 31 32 // ListViewのインスタンスを生成 33 ListView listView = findViewById(R.id.list_view); 34 35 // BaseAdapter を継承したadapterのインスタンスを生成 36 // レイアウトファイル list.xml を activity_main.xml に inflate するためにadapterに引数として渡す 37 adapter = new ListViewAdapter(this.getApplicationContext(), R.layout.list, memoDataList); 38 39 View header = (View)getLayoutInflater().inflate(R.layout.header,null); 40 listView.addHeaderView(header); 41 42 // ListViewにadapterをセット 43 listView.setAdapter(adapter); 44 45 // 下記をセットするとヘッダーをクリックしても反応しなくなる。 46// header.setFocusable(true); 47 48 //イベントを拾えるようにListenerをlistViewに登録する。 49 // クラス定義でimplementsしているため、引数がthisでOK。implementsしていない場合、thisを引数の型へキャストが必要 50 listView.setOnItemClickListener(this); 51 listView.setOnItemLongClickListener(this); 52 53 // FloatingActionButton 54 FloatingActionButton fab = findViewById(R.id.add_fab); 55 // implementsしない場合はonCreate()内にListenerを実装する。 56 fab.setOnClickListener(v -> { 57 Intent intent = new Intent(getApplication(), AddEditMemo.class); 58 resultLauncher.launch(intent); 59 }); 60 } 61 62 ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult( 63 new ActivityResultContracts.StartActivityForResult(), 64 new ActivityResultCallback<ActivityResult>() { 65 @Override 66 public void onActivityResult(ActivityResult result) { 67 memoDataList = helper.createMemoDataList(); 68 adapter.setItemList(memoDataList); 69 adapter.notifyDataSetChanged(); 70 } 71 }); 72 73 @Override 74 public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 75 //headerをクリックした時は何もしない 76 if(position ==0) { 77 return; 78 } 79 80 Intent intent = new Intent(getApplication(), AddEditMemo.class); 81 resultLauncher.launch(intent); 82 } 83 84 private void setPosition(int position) { 85 tappedPosition = position; 86 } 87 88 // ListViewで選択したPosition(row)に表示しているitemのidexを返す。 89 private int getSelectPositionItemIndex() { 90 return tappedPosition - 1; 91 } 92 93 // ListViewで選択したPosition(row)を返す。 94 private int getPosition() { 95 return tappedPosition; 96 } 97}

ListViewAdapter.java

1package com.example.memoapp_android 2 3import ... 4 5public class ListViewAdapter extends BaseAdapter { 6 7 static class ViewHolder { 8 TextView titleView; 9 TextView timeStampView; 10 } 11 12 private List<Item> itemList; 13 private final LayoutInflater inflater; 14 private final int itemLayoutId; 15 16 ListViewAdapter(Context context, int itemLayoutId, List<Item> itemList) { 17 super(); 18 this.inflater = 19 (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 20 this.itemLayoutId = itemLayoutId; 21 this.itemList = itemList; 22 } 23 24 public List<Item> getItemList() { 25 return this.itemList; 26 } 27 28 public void setItemList(List<Item> memoDataList){ 29 this.itemList = memoDataList; 30 } 31 32 @Override 33 //一行ずつmemoの情報を紐づける。 34 public View getView(int position, View convertView, ViewGroup parent) { 35 Item item = itemList.get(position); 36 ViewHolder holder; 37 // 最初だけ View を inflate して、それを再利用する 38 if (convertView == null) { 39 // activity_main.xml に list.xml を inflate して convertView とする 40 convertView = inflater.inflate(itemLayoutId, parent, false); 41 // ViewHolder を生成 42 holder = new ViewHolder(); 43 holder.titleView = convertView.findViewById(R.id.titleView); 44 holder.timeStampView = convertView.findViewById(R.id.timeStampView); 45 convertView.setTag(holder); 46 } 47 // holder を使って再利用する。 48 else { 49 holder = (ViewHolder) convertView.getTag(); 50 } 51 52 // holder の titleView にセットするとList ViewのtitleViewに値が入る 53 holder.titleView.setText(item.getItemTitle()); 54 // 現在の position にあるmemoのタイトルリストを holder の textView にセット 55 holder.timeStampView.setText(item.getItemTimeStamp()); 56 57 return convertView; 58 } 59 60 @Override 61 //リストに表示するデータの個数 62 public int getCount() { 63 // texts 配列の要素数 64 return itemList.size(); 65 } 66 67 @Override 68 // ListViewで選択した行にセットされているitemを返す。 69 // position 1のitemListのindexは2 70 public Object getItem(int position) { 71 // header分potisonを-1している 72 return itemList.get(position-1); 73 } 74 75 @Override 76 //引数で指定された位置にあるListVewの_id(データベースのid)を返す 77 public long getItemId(int position) { 78 return itemList.get(position).getItemId(); 79 } 80}

activity_main.xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <ListView 11 android:id="@+id/list_view" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 app:layout_constraintTop_toTopOf="parent" /> 15 16 <com.google.android.material.floatingactionbutton.FloatingActionButton 17 android:id="@+id/add_fab" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:layout_margin="16dp" 21 android:clickable="true" 22 app:srcCompat="@android:drawable/ic_input_add" 23 app:layout_constraintBottom_toBottomOf="parent" 24 app:layout_constraintEnd_toEndOf="parent" /> 25</androidx.constraintlayout.widget.ConstraintLayout>

list.xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 7 <TextView 8 android:id="@+id/titleView" 9 android:layout_marginLeft="20dp" 10 android:layout_gravity="center_vertical" 11 android:layout_weight="0.6" 12 android:layout_height="wrap_content" 13 android:layout_width="0dp" 14 android:textSize="20sp" 15 android:textColor="#000" /> 16 17 <TextView 18 android:id="@+id/timeStampView" 19 android:layout_marginLeft="20dp" 20 android:layout_gravity="center_vertical" 21 android:layout_weight="0.4" 22 android:layout_height="wrap_content" 23 android:layout_width="0dp" 24 android:textSize="20sp" 25 android:textColor="#000" /> 26 /> 27 28</LinearLayout>

header.xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="wrap_content" 5 android:orientation="horizontal" 6 android:gravity="top"> 7 8 <TextView 9 android:id="@+id/header1" 10 android:layout_weight="0.6" 11 android:layout_height="wrap_content" 12 android:layout_width="0dp" 13 android:gravity="center_vertical" 14 android:textSize="20sp" 15 android:layout_marginLeft="20dp" 16 android:text="タイトル" /> 17 <TextView 18 android:id="@+id/header2" 19 android:layout_weight="0.4" 20 android:layout_height="wrap_content" 21 android:layout_width="0dp" 22 android:gravity="center_vertical" 23 android:textSize="20sp" 24 android:layout_marginLeft="20dp" 25 android:text="更新日時"/> 26</LinearLayout>

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

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

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

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

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

guest

回答1

0

ベストアンサー

考え方としては以下のようなことになります。
AndroidのListViewにて、List上に配置したボタンのイベントを取得したい。


MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.os.Bundle; 4import android.util.Log; 5import android.view.*; 6import android.widget.*; 7 8import java.util.*; 9 10public class MainActivity extends AppCompatActivity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 ListView listview = findViewById(R.id.listview); 18 19 View header = getLayoutInflater().inflate(R.layout.list_header, listview, false); 20 header.findViewById(R.id.title).setOnClickListener(v -> Log.d("MainActivity ***", "click: header title")); 21 header.findViewById(R.id.updateDate).setOnClickListener(v -> Log.d("MainActivity ***", "click: header updateDate")); 22 listview.addHeaderView(header); 23 24 List<Map<String,String>> data = new ArrayList<Map<String,String>>(); 25 Map<String,String> value = new HashMap<String,String>(); 26 value.put("text1", "data1"); 27 value.put("text2", "data2"); 28 data.add(value); 29 listview.setAdapter(new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"text1","text2"}, new int[]{android.R.id.text1,android.R.id.text2})); 30 } 31}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<ListView 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/listview" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity" />

res/layout/list_header.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_width="match_parent" 5 android:layout_height="wrap_content" 6 xmlns:app="http://schemas.android.com/apk/res-auto"> 7 <TextView 8 android:id="@+id/title" 9 android:layout_width="0dp" 10 android:layout_height="wrap_content" 11 android:textSize="20sp" 12 android:text="タイトル" 13 android:clickable="true" 14 app:layout_constraintHorizontal_weight="6" 15 app:layout_constraintEnd_toStartOf="@id/updateDate" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18 <TextView 19 android:id="@+id/updateDate" 20 android:layout_width="0dp" 21 android:layout_height="wrap_content" 22 android:textSize="20sp" 23 android:text="更新日時" 24 android:clickable="true" 25 app:layout_constraintHorizontal_weight="4" 26 app:layout_constraintEnd_toEndOf="parent" 27 app:layout_constraintStart_toEndOf="@id/title" 28 app:layout_constraintTop_toTopOf="parent" /> 29</androidx.constraintlayout.widget.ConstraintLayout>

実行結果
エミュレータスクリーンショット
"タイトル","更新日時"をクリックした時のログ

plain

1D/MainActivity ***: click: header title 2D/MainActivity ***: click: header updateDate

投稿2022/09/17 17:34

編集2022/09/17 20:27
jimbe

総合スコア12646

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

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

Nooki

2022/09/18 08:45

再び、ご丁寧な回答をいただきありがとうございました。 やりたいことが実現できました。 headerのTextViewにリスナーをセットするのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問