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

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

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

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

Android

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

Q&A

解決済

1回答

733閲覧

リストの1行ごとに背景を変えたい

syosinsya109

総合スコア41

Java

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

Android

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

0グッド

0クリップ

投稿2023/01/23 11:29

編集2023/01/24 05:36

前提

androidstudioについて質問します。
以下のプログラムにおいて、リストを1行ごとに色を変えたいと思っていますが、レイアウトの1行の取り方がわからずに困っています。どうしたら1行取得できますか

実現したいこと

リストの1行ごとに背景を変えたい

該当のソースコード

DatabaseHelper.java

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

SampleDAO.java

1import android.database.Cursor; 2import android.database.sqlite.SQLiteDatabase; 3import android.database.sqlite.SQLiteStatement; 4 5public class SampleDAO { 6 public static Cursor findAll(SQLiteDatabase db){ 7 String sql = "SELECT * FROM sample"; 8 Cursor cursor = db.rawQuery(sql, null); 9 return cursor; 10 } 11 12 public static long insert(SQLiteDatabase db, String name, int age){ 13 String sql = "INSERT INTO sample (name, age) VALUES (?, ?)"; 14 SQLiteStatement stmt = db.compileStatement(sql); 15 stmt.bindString(1, name); 16 stmt.bindLong(2, age); 17 long insertedId = stmt.executeInsert(); 18 return insertedId; 19 } 20}

MainActivity.java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.database.Cursor; 4import android.database.sqlite.SQLiteDatabase; 5import android.os.Bundle; 6import android.view.View; 7import android.widget.Button; 8import android.widget.ListView; 9import android.widget.SimpleCursorAdapter; 10 11import java.util.ArrayList; 12 13public class MainActivity extends AppCompatActivity { 14 /** 15 * データベースヘルパーオブジェクト。 16 */ 17 private DatabaseHelper _helper; 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 _helper = new DatabaseHelper(this); 24 SQLiteDatabase db = _helper.getWritableDatabase(); 25 26 ArrayList<ArrayList<String>> list = new ArrayList<>(); 27 28 ArrayList<String> record = new ArrayList<>(); 29 record.add("赤松"); 30 record.add("20"); 31 list.add(record); 32 record = new ArrayList<>(); 33 record.add("河田"); 34 record.add("30"); 35 list.add(record); 36 record = new ArrayList<>(); 37 record.add("鈴木"); 38 record.add("40"); 39 list.add(record); 40 record = new ArrayList<>(); 41 record.add("山田"); 42 record.add("20"); 43 list.add(record); 44 record = new ArrayList<>(); 45 record.add("石田"); 46 record.add("20"); 47 list.add(record); 48 49 for(int i=0; i<list.size(); i++){ 50 SampleDAO.insert(db, list.get(i).get(0), Integer.parseInt(list.get(i).get(1))); 51 } 52 53 Cursor cursor = SampleDAO.findAll(db); 54 ListView flashcardList = findViewById(R.id.listView); 55 //単語帳を表示 56 String[] from = {"name", "age", "_id"}; 57 int[] to = {R.id.textView1, R.id.textView2, R.id.edit}; 58 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list, cursor, from, to, 0); 59 adapter.setViewBinder(new ViewBinder()); 60 flashcardList.setAdapter(adapter); 61 } 62 63 private class ViewBinder implements SimpleCursorAdapter.ViewBinder { 64 @Override 65 public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 66long id = Long.parseLong(cursor.getString(columnIndex)); 67 switch(view.getId()) { 68 case R.id.edit: 69 Button button = view.findViewById(R.id.edit); 70 long id = Long.parseLong(cursor.getString(columnIndex)); 71 if(id % 2 == 1){ 72 ((ViewGroup)button.getParent()).setBackgroundColor(Color.rgb(127, 127, 255)); 73 } 74 return true; 75 } 76 return false; 77 } 78 } 79}

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/listView" 12 android:layout_width="0dp" 13 android:layout_height="0dp" 14 android:layout_marginStart="8dp" 15 android:layout_marginTop="8dp" 16 android:layout_marginEnd="8dp" 17 android:layout_marginBottom="8dp" 18 app:layout_constraintBottom_toBottomOf="parent" 19 app:layout_constraintEnd_toEndOf="parent" 20 app:layout_constraintStart_toStartOf="parent" 21 app:layout_constraintTop_toTopOf="parent" /> 22</androidx.constraintlayout.widget.ConstraintLayout>

list.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 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 7 <Button 8 android:id="@+id/edit" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:layout_marginTop="8dp" 12 android:layout_marginEnd="8dp" 13 android:text="編集" 14 app:layout_constraintEnd_toEndOf="parent" 15 app:layout_constraintTop_toTopOf="parent" /> 16 17 <TextView 18 android:id="@+id/textView2" 19 android:layout_width="0dp" 20 android:layout_height="wrap_content" 21 android:layout_marginStart="8dp" 22 android:layout_marginEnd="8dp" 23 app:layout_constraintBottom_toBottomOf="@+id/edit" 24 app:layout_constraintEnd_toStartOf="@+id/edit" 25 app:layout_constraintStart_toStartOf="@+id/guideline2" 26 app:layout_constraintTop_toTopOf="@+id/edit" /> 27 28 <androidx.constraintlayout.widget.Guideline 29 android:id="@+id/guideline2" 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:orientation="vertical" 33 app:layout_constraintGuide_percent="0.4" /> 34 35 <TextView 36 android:id="@+id/textView1" 37 android:layout_width="0dp" 38 android:layout_height="wrap_content" 39 android:layout_marginStart="8dp" 40 android:layout_marginEnd="8dp" 41 app:layout_constraintBottom_toBottomOf="@+id/edit" 42 app:layout_constraintEnd_toStartOf="@+id/guideline2" 43 app:layout_constraintStart_toStartOf="parent" 44 app:layout_constraintTop_toTopOf="@+id/edit" /> 45</androidx.constraintlayout.widget.ConstraintLayout>

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

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

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

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

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

jimbe

2023/01/23 13:49 編集

>switch(view.getId()) { >case R.id.edit: >Button button = view.findViewById(R.id.edit); view.getId() が R.id.edit なら view 自体が Button ですので findViewById は不要でしょう。 Button button = (Button)view; そして button の親が ConstraintLayout ですから、 button.getParent() で行が取れると思います。
syosinsya109

2023/01/23 14:07

コメントありがとうございます。 バックグラウンドを指定するメソッドはsetBackgroundColorだと思うのですが、button.getParent()にはないみたいで、背景色が付与することができません。書き方、考え方が間違えているのでしょうか
jimbe

2023/01/23 14:28 編集

button.getParent() が返す ViewParent を ViewGroup にキャストすれば setBackgroundColor は使えます。 他に、行レイアウトの root に id を付け <androidx.constraintlayout.widget.ConstraintLayout ~ android:id="@+id/row" ~ from/to に指定を追加すれば String[] from = {"name", "age", "_id", "_id"}; //rowに対応するのは何でも int[] to = {R.id.textView1, R.id.textView2, R.id.edit, R.id.row}; setViewValue でボタンと同じように得られます。 switch(view.getId()) { case R.id.edit: ~ case R.id.row: ~ }
syosinsya109

2023/01/23 14:27

(ViewGroup)button.getParent().setBackgroundColor(Color.rgb(127, 127, 255)); こういうことでしょうか。それでもエラーが出てきます。 setBackgroundColorを使っているサイトがあり、Viewをキャストして試してみましたが、同様にエラーが出てきました。
jimbe

2023/01/23 14:29

>button.getParent() が返す ViewParent を ViewGroup にキャスト です。 ((ViewGroup)button.getParent()).setBackgroundColor(Color.rgb(127, 127, 255));
syosinsya109

2023/01/23 15:55

ありがとうございました!おかげで色を変えることができました! 追加で質問してもいいでしょうか。良くてもダメでもベストアンサーに選びたいので回答をしてくださるとうれしいです。 質問 自分は1行ごとの色を変化させたくてこの質問をしました。そして先ほどのやり方で色は変更できましたが、スクロールするたび色が変動してしまいます。id % 2 == 1のようなif文を書いても変動してしまいます。 多分ですがスクロールするたびにViewBinderを経由するのでずれるものと思われます。どのようにしたら対処できるのでしょうか
jimbe

2023/01/23 16:25 編集

"スクロールするたび色が変動" してしまう時のコードをご提示ください。 setViewValue は 1 行につき from/to の件数分 view と columnIndex を変えて呼ばれます。 もし setViewValue の最初で long id = Long.parseLong(cursor.getString(columnIndex)); としているなら、ボタンの時以外(R.id.name や R.id.age) では例外が発生したり年齢が id になったりで、id % 2 == 1 の判定も意味無いでしょう。 コードを移動させるなら、各変数値がどうなっているのかを注意してください。 cursor.getString(columnIndex) が _id 列の値を返すのは、 String[] from = {"name", "age", "_id"}; int[] to = {R.id.textView1, R.id.textView2, R.id.edit}; なら view.getId() が R.id.edit の時だけです。
syosinsya109

2023/01/24 05:40

すいません。ただいま修正しました。 editボタンを全行配置していますので、表示した時にはid % 2 == 1がtrueの時に入っていると思っています。
jimbe

2023/01/24 06:31 編集

long id = ~ が switch の中にあるのでしたら、外の同処理は削除してください。余計な処理を残しておくと、後で問題になる可能性をも残します。 ListView は行のビューを再利用します。 背景色を特定の場合だけ変更するのなら、特定で無い場合の背景色も設定してください。
syosinsya109

2023/01/24 10:56

無事できました!!ありがとうございます!
guest

回答1

0

ベストアンサー

こんな感じでしょうか?

java

1 switch(view.getId()) { 2 case R.id.edit: 3 Button button = view.findViewById(R.id.edit); 4 long id = Long.parseLong(cursor.getString(columnIndex)); 5 int bgcolor = id % 2 == 1 ? Color.rgb(127, 127, 255) : Color.rgb(255, 255, 255); 6 ((ViewGroup)button.getParent()).setBackgroundColor(bgcolor);

なおこの実装では、データベースの id が連続した番号かどうか、データベースからデータを削除することは無いかが問題になるかもしれません。
表示上1行置きに色を変えるだけであれば、 id % 2 では無く curosr.getPosition() % 2 を使う手もあるかもしれません。

投稿2023/01/24 13:14

編集2023/01/24 13:22
jimbe

総合スコア12646

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

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

syosinsya109

2023/01/27 09:08

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問