Q&A
前提
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
というエラーになってしまいます。
何が違うのでしょうか。また、どのようにしたら自分のしたいことが実現できるのでしょうか。
回答1件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/12/13 06:35
2022/12/13 06:58