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

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

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

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

Android

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

Q&A

解決済

1回答

659閲覧

SimpleCursorAdapterでxmlの変更がしたい

syosinsya109

総合スコア41

Java

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

Android

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

0グッド

0クリップ

投稿2022/12/12 15:18

前提

androidについて質問します。
自分は、SimpleCursorAdapterを用いて、点数が70以上で祝いの画像を、70点未満で残念な画像をリストビュー内で出力したいと思っています。ですが、70点未満で画像を変更したいのにうまくいきません。

実現したいこと

SimpleCursorAdapterでxmlの変更がしたい

該当のソースコード

java(DatabaseHelper.java)

1import android.content.Context; 2import android.database.sqlite.SQLiteDatabase; 3import android.database.sqlite.SQLiteOpenHelper; 4 5public class DatabaseHelper extends SQLiteOpenHelper { 6 /** 7 * データベースフォイル名の定数フィールド。 8 */ 9 private static final String DATABASE_NAME = "sample.db"; 10 /** 11 * バージョン情報の定義フィールド 12 */ 13 private static final int DATABASE_VERSION = 1; 14 15 /** 16 * コンストラクタ。 17 * 18 * @param context コンテキスト 19 */ 20 public DatabaseHelper(Context context){ 21 super(context, DATABASE_NAME, null, DATABASE_VERSION); 22 } 23 24 @Override 25 public void onCreate(SQLiteDatabase db){ 26 //ユーザー情報 27 StringBuffer sb = new StringBuffer(); 28 sb.append("CREATE TABLE user ("); 29 sb.append("_id INTEGER PRIMARY KEY AUTOINCREMENT,"); 30 sb.append("name TEXT NOT NULL,"); 31 sb.append("point TEXT NOT NULL"); 32 sb.append(");"); 33 String sql = sb.toString(); 34 35 db.execSQL(sql); 36 } 37 38 @Override 39 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 40 } 41} 42

java(main.java)

1package local.hal.st31.android.dialog; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.ImageView; 10import android.widget.ListView; 11import android.widget.SimpleCursorAdapter; 12 13public class MainActivity extends AppCompatActivity { 14 private DatabaseHelper _helper; 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 _helper = new DatabaseHelper(MainActivity.this); 21 SQLiteDatabase db = _helper.getWritableDatabase(); 22 //データベースにデータを代入 23 UserDAO.insert(db); 24 25 //リストを取得 26 ListView list = findViewById(R.id.list); 27 28 Cursor cursor = UserDAO.findAll(db); 29 String[] from = {"name"}; 30 int[] to = {R.id.name}; 31 SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.list_image, cursor, from, to, 0); 32 adapter.setViewBinder(new CustomViewBinder()); 33 list.setAdapter(adapter); 34 } 35 36 /** 37 * リストビューのカスタムビューバインダークラス。 38 */ 39 private class CustomViewBinder implements SimpleCursorAdapter.ViewBinder { 40 @Override 41 public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 42 _helper = new DatabaseHelper(MainActivity.this); 43 SQLiteDatabase db = _helper.getWritableDatabase(); 44 int startPosition = cursor.getPosition(); 45 cursor.moveToFirst(); 46 47 int viewId = view.getId(); 48 CharSequence[] list = new CharSequence[cursor.getCount()]; 49 switch(viewId) { 50 case R.id.image: 51 ImageView myImage = (ImageView) view; 52 for (int i = 0; i < cursor.getCount(); i++) { 53 54 if(Integer.parseInt(cursor.getString(2)) < 70){ 55 myImage.setImageResource(R.drawable.ng); 56 } 57 58 cursor.moveToNext(); 59 } 60 cursor.moveToPosition(startPosition); 61 return true; 62 } 63 64 return false; 65 } 66 } 67}

java(UserDAO.java)

1import android.database.Cursor; 2import android.database.sqlite.SQLiteDatabase; 3import android.database.sqlite.SQLiteStatement; 4 5import java.util.ArrayList; 6 7public class UserDAO { 8 public static Cursor findAll(SQLiteDatabase db){ 9 String sql = "SELECT * FROM user"; 10 Cursor cursor = db.rawQuery(sql, null); 11 return cursor; 12 } 13 14 public static void insert(SQLiteDatabase db){ 15 ArrayList<ArrayList<String>> parent = new ArrayList<ArrayList<String>>(); 16 ArrayList<String> child = new ArrayList<>(); 17 18 child.add("赤松"); 19 child.add("40"); 20 parent.add(child); 21 child.add("鈴木"); 22 child.add("80"); 23 parent.add(child); 24 child.add("木下"); 25 child.add("50"); 26 parent.add(child); 27 28 for(int i = 0; i < parent.size(); i++){ 29 String sql = "INSERT INTO user (name, point) VALUES (?, ?)"; 30 SQLiteStatement stmt = db.compileStatement(sql); 31 stmt.bindString(1, parent.get(i).get(0)); 32 stmt.bindString(2, parent.get(i).get(1)); 33 stmt.executeInsert(); 34 } 35 } 36}

xml(activit_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 android:gravity="center" 9 android:orientation="vertical" 10 android:padding="20dp" 11 tools:context=".MainActivity"> 12 13 <ListView 14 android:id="@+id/list" 15 android:layout_width="match_parent" 16 android:layout_height="match_parent" 17 app:layout_constraintBottom_toBottomOf="parent" 18 app:layout_constraintEnd_toEndOf="parent" 19 app:layout_constraintStart_toStartOf="parent" 20 app:layout_constraintTop_toTopOf="parent" /> 21</androidx.constraintlayout.widget.ConstraintLayout>

xml(list_image.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 8 <androidx.constraintlayout.widget.Guideline 9 android:id="@+id/guideline2" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:orientation="vertical" 13 app:layout_constraintGuide_percent="0.5" /> 14 15 <TextView 16 android:id="@+id/name" 17 android:layout_width="0dp" 18 android:layout_height="wrap_content" 19 android:layout_marginStart="8dp" 20 android:layout_marginTop="8dp" 21 android:layout_marginEnd="8dp" 22 app:layout_constraintEnd_toStartOf="@+id/guideline2" 23 app:layout_constraintStart_toStartOf="parent" 24 app:layout_constraintTop_toTopOf="parent" /> 25 26 <ImageView 27 android:id="@+id/image" 28 android:layout_width="0dp" 29 android:layout_height="wrap_content" 30 android:layout_marginStart="8dp" 31 android:layout_marginTop="8dp" 32 android:layout_marginEnd="8dp" 33 android:src="@drawable/ok" 34 app:layout_constraintEnd_toEndOf="parent" 35 app:layout_constraintStart_toStartOf="@+id/guideline2" 36 app:layout_constraintTop_toTopOf="parent" /> 37 38</androidx.constraintlayout.widget.ConstraintLayout>

試したこと

以下のURLを参照してみました。
https://qiita.com/watataku8911/items/36bf775ec5446dc860a8
参照元も、同じようなやり方でしていて、xmlにimageViewがあったらmain.javaのImageView myImage = (ImageView) view;で変換できると思うのですが、
java.lang.ClassCastException: com.google.android.material.textview.MaterialTextView cannot be cast to android.widget.ImageView
になってしまい、ImageView myImage = view.findViewById(R.id.image);を使おうとも思ったのですが、
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
というエラーになってしまいます。
何が違うのでしょうか。また、どのようにしたら自分のしたいことが実現できるのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ViewBinder の使い方が間違われています。
ViewBinder の setViewValue メソッドは「リストの各行毎の、 SimpleCursorAdapter のコンストラクタの from/to の件数毎」に呼ばれ、そのパラメータは、 view が to に指定した id の view、 cursor がその行位置まで移動した状態のカーソル、 columnIndex が from で指定したカラム名の位置です。
つまり『この行のこの view に cursor の 指定カラムのデータをどう表示するのか』だけをするのであって、cursor を動かす必要はありませんし、 from/to に指定していない columnIndex/view に関する呼び出しは行われません。 ( アダプタにとっては from/to に指定していないビューは存在しないも同じです。 )

MainActivity.java の一部

java

1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main); 5 6 //(略) 7 8 Cursor cursor = UserDAO.findAll(db); 9 String[] from = { "name", "point" }; //カーソル内の列名 ( これから cursor#getColumnIndex() で setViewValue() の columnIndex パラメータが生成される ) 10 int[] to = { R.id.name, R.id.image }; //列に対応する layout 内の view の id ( これから findViewById() で setViewValue() の view パラメータが生成される ) 11 SimpleCursorAdapter adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.list_image, cursor, from, to, 0); 12 adapter.setViewBinder(new CustomViewBinder()); 13 list.setAdapter(adapter); 14 } 15 16 private class CustomViewBinder implements SimpleCursorAdapter.ViewBinder { 17 @Override 18 public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 19 switch(view.getId()) { //to に書いたどれかが来ているはず 20 case R.id.image: 21 ImageView imageView = (ImageView)view; 22 int point = Integer.parseInt(cursor.getString(columnIndex)); //なぜ point カラムは INTEGER でなく TEXT? 23 imageView.setImageResource(point < 70 ? R.drawable.ng : R.drawable.ok); //okの場合も設定 ( view が使い回されている可能性がある ) 24 return true; 25 } 26 return false; //name はアダプタのデフォルトで処理 27 } 28 }

なお、ビューの表示内容を変えることを「xmlの変更」と表現されてもかなり伝わり難いと思います。
レイアウト xml 自体は静的なもので、アプリから変更するようなモノではありません。

投稿2022/12/13 02:33

編集2022/12/13 03:17
jimbe

総合スコア12492

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

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

syosinsya109

2022/12/13 06:35

回答ありがとうございます。プログラムにミスがあるのはすいません。自分のしたいことを貼るにはすごく長いプログラムになってしまうので、簡単にサンプルとして作っただけなので。。したいことが伝わればいいなと思い貼らせてもらいました。 送っていただいたサンプルを参考にしたらうまくいきました。ありがとうございます!
jimbe

2022/12/13 06:58

>簡単にサンプルとして作っただけなので。。したいことが伝わればいいなと思い貼らせてもらいました。 とても助かります。提示頂いたものがオリジナルでの問題を含んでいることが大事で、それが無かったら意味がありませんので、ミスがあるのが逆に普通ではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問