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

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

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

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

Android

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

Android Studio

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

解決済

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

Nooki
Nooki

総合スコア18

Java

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

Android

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

Android Studio

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

1回答

0リアクション

0クリップ

264閲覧

投稿2022/09/17 17:02

編集2022/09/17 17:03

実現したいこと

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

教えていただきたいこと

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

前提

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

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

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

該当のソースコード

MainAcivity.java

package com.example.memoapp_android import ... public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { private TestOpenHelper helper; private SQLiteDatabase db; private ListViewAdapter adapter; // 要素の削除、順番変更のためArrayListを定義 private List<String> itemNames; private List<String> itemTimeStamps; // タップされたitemの位置 private int tappedPosition = 0; List<Item> memoDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (helper == null) { helper = new TestOpenHelper(getApplicationContext()); } memoDataList = helper.createMemoDataList(); // ListViewのインスタンスを生成 ListView listView = findViewById(R.id.list_view); // BaseAdapter を継承したadapterのインスタンスを生成 // レイアウトファイル list.xml を activity_main.xml に inflate するためにadapterに引数として渡す adapter = new ListViewAdapter(this.getApplicationContext(), R.layout.list, memoDataList); View header = (View)getLayoutInflater().inflate(R.layout.header,null); listView.addHeaderView(header); // ListViewにadapterをセット listView.setAdapter(adapter); // 下記をセットするとヘッダーをクリックしても反応しなくなる。 // header.setFocusable(true); //イベントを拾えるようにListenerをlistViewに登録する。 // クラス定義でimplementsしているため、引数がthisでOK。implementsしていない場合、thisを引数の型へキャストが必要 listView.setOnItemClickListener(this); listView.setOnItemLongClickListener(this); // FloatingActionButton FloatingActionButton fab = findViewById(R.id.add_fab); // implementsしない場合はonCreate()内にListenerを実装する。 fab.setOnClickListener(v -> { Intent intent = new Intent(getApplication(), AddEditMemo.class); resultLauncher.launch(intent); }); } ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { memoDataList = helper.createMemoDataList(); adapter.setItemList(memoDataList); adapter.notifyDataSetChanged(); } }); @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { //headerをクリックした時は何もしない if(position ==0) { return; } Intent intent = new Intent(getApplication(), AddEditMemo.class); resultLauncher.launch(intent); } private void setPosition(int position) { tappedPosition = position; } // ListViewで選択したPosition(row)に表示しているitemのidexを返す。 private int getSelectPositionItemIndex() { return tappedPosition - 1; } // ListViewで選択したPosition(row)を返す。 private int getPosition() { return tappedPosition; } }

ListViewAdapter.java

package com.example.memoapp_android import ... public class ListViewAdapter extends BaseAdapter { static class ViewHolder { TextView titleView; TextView timeStampView; } private List<Item> itemList; private final LayoutInflater inflater; private final int itemLayoutId; ListViewAdapter(Context context, int itemLayoutId, List<Item> itemList) { super(); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.itemLayoutId = itemLayoutId; this.itemList = itemList; } public List<Item> getItemList() { return this.itemList; } public void setItemList(List<Item> memoDataList){ this.itemList = memoDataList; } @Override //一行ずつmemoの情報を紐づける。 public View getView(int position, View convertView, ViewGroup parent) { Item item = itemList.get(position); ViewHolder holder; // 最初だけ View を inflate して、それを再利用する if (convertView == null) { // activity_main.xml に list.xml を inflate して convertView とする convertView = inflater.inflate(itemLayoutId, parent, false); // ViewHolder を生成 holder = new ViewHolder(); holder.titleView = convertView.findViewById(R.id.titleView); holder.timeStampView = convertView.findViewById(R.id.timeStampView); convertView.setTag(holder); } // holder を使って再利用する。 else { holder = (ViewHolder) convertView.getTag(); } // holder の titleView にセットするとList ViewのtitleViewに値が入る holder.titleView.setText(item.getItemTitle()); // 現在の position にあるmemoのタイトルリストを holder の textView にセット holder.timeStampView.setText(item.getItemTimeStamp()); return convertView; } @Override //リストに表示するデータの個数 public int getCount() { // texts 配列の要素数 return itemList.size(); } @Override // ListViewで選択した行にセットされているitemを返す。 // position 1のitemListのindexは2 public Object getItem(int position) { // header分potisonを-1している return itemList.get(position-1); } @Override //引数で指定された位置にあるListVewの_id(データベースのid)を返す public long getItemId(int position) { return itemList.get(position).getItemId(); } }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/add_fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:clickable="true" app:srcCompat="@android:drawable/ic_input_add" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>

list.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/titleView" android:layout_marginLeft="20dp" android:layout_gravity="center_vertical" android:layout_weight="0.6" android:layout_height="wrap_content" android:layout_width="0dp" android:textSize="20sp" android:textColor="#000" /> <TextView android:id="@+id/timeStampView" android:layout_marginLeft="20dp" android:layout_gravity="center_vertical" android:layout_weight="0.4" android:layout_height="wrap_content" android:layout_width="0dp" android:textSize="20sp" android:textColor="#000" /> /> </LinearLayout>

header.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="top"> <TextView android:id="@+id/header1" android:layout_weight="0.6" android:layout_height="wrap_content" android:layout_width="0dp" android:gravity="center_vertical" android:textSize="20sp" android:layout_marginLeft="20dp" android:text="タイトル" /> <TextView android:id="@+id/header2" android:layout_weight="0.4" android:layout_height="wrap_content" android:layout_width="0dp" android:gravity="center_vertical" android:textSize="20sp" android:layout_marginLeft="20dp" android:text="更新日時"/> </LinearLayout>

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android

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

Android Studio

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