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

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

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

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

Android Studio

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

Q&A

解決済

1回答

258閲覧

ListVewでスクロールを繰り返すと意図していない行の表示が変わる

tanuki_

総合スコア35

Java

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

Android Studio

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

0グッド

0クリップ

投稿2024/09/19 07:45

実現したいこと

スクロールを繰り返しても意図していない行の表示が変わることを防ぎたい。

発生している問題・分からないこと

ListViewを使った一覧表を作成しています。
フラグが立っているTextViewのみ色を変えているのですが、スクロールを繰り返していると、
違う行のフラグが立っていないTextViewの色まで変わってしまう。

エラーメッセージ

error

1エラーメッセージは特に出ていません。

該当のソースコード

private class ControlAdapter extends BaseAdapter { private final ArrayList<ReserveTimetableViewData> reserveList; private final LayoutInflater inflater; //private final LocalDateTime dateTimeNow; public ControlAdapter(Context context, ArrayList<ReserveTimetableViewData> items) { this.reserveList = items; this.inflater = LayoutInflater.from(context); //this.dateTimeNow = datetime; } public ArrayList<ReserveTimetableViewData> getItems() { return this.reserveList; } @Override public int getCount() { return reserveList.size(); } @Override public Object getItem(int pos) { return reserveList.get(pos); } @Override public long getItemId(int pos) { return reserveList.get(pos).getPatternId(); } @Override public View getView(int pos, View view, ViewGroup viewGroup) { ReserveTimetableViewData data = reserveList.get(pos); if (view == null) { view = inflater.inflate(R.layout.item_reserve_timetable_result, null); } //各時間 TextView time0800Text = view.findViewById(R.id.time_0800); //TODO 色は状況により変化する if(data.getTime0800() == 1){ isReserveTime(time0800Text); } TextView time0830Text = view.findViewById(R.id.time_0830); if(data.getTime0830() == 1){ isReserveTime(time0830Text); } TextView time0900Text = view.findViewById(R.id.time_0900); if(data.getTime0900() == 1){ isReserveTime(time0900Text); } TextView time0930Text = view.findViewById(R.id.time_0930); if(data.getTime0930() == 1){ isReserveTime(time0930Text); } TextView time1000Text = view.findViewById(R.id.time_1000); if(data.getTime1000() == 1){ isReserveTime(time1000Text); } TextView time1030Text = view.findViewById(R.id.time_1030); if(data.getTime1030() == 1){ isReserveTime(time1030Text); } TextView time1100Text = view.findViewById(R.id.time_1100); if(data.getTime1100() == 1){ isReserveTime(time1100Text); } TextView time1130Text = view.findViewById(R.id.time_1130); if(data.getTime1130() == 1){ isReserveTime(time1130Text); } TextView time1200Text = view.findViewById(R.id.time_1200); if(data.getTime1200() == 1){ isReserveTime(time1200Text); } TextView time1230Text = view.findViewById(R.id.time_1230); if(data.getTime1230() == 1){ isReserveTime(time1230Text); } TextView time1300Text = view.findViewById(R.id.time_1300); if(data.getTime1300() == 1){ isReserveTime(time1300Text); } TextView time1330Text = view.findViewById(R.id.time_1330); if(data.getTime1330() == 1){ isReserveTime(time1330Text); } TextView time1400Text = view.findViewById(R.id.time_1400); if(data.getTime1400() == 1){ isReserveTime(time1400Text); } TextView time1430Text = view.findViewById(R.id.time_1430); if(data.getTime1430() == 1){ isReserveTime(time1430Text); } TextView time1500Text = view.findViewById(R.id.time_1500); if(data.getTime1500() == 1){ isReserveTime(time1500Text); } TextView time1530Text = view.findViewById(R.id.time_1530); if(data.getTime1530() == 1){ isReserveTime(time1530Text); } TextView time1600Text = view.findViewById(R.id.time_1600); if(data.getTime1600() == 1){ isReserveTime(time1600Text); } TextView time1630Text = view.findViewById(R.id.time_1630); if(data.getTime1630() == 1){ isReserveTime(time1630Text); } TextView time1700Text = view.findViewById(R.id.time_1700); if(data.getTime1700() == 1){ isReserveTime(time1700Text); } TextView time1730Text = view.findViewById(R.id.time_1730); if(data.getTime1730() == 1){ isReserveTime(time1730Text); } TextView time1800Text = view.findViewById(R.id.time_1800); if(data.getTime1800() == 1){ isReserveTime(time1800Text); } TextView time1830Text = view.findViewById(R.id.time_1830); if(data.getTime1830() == 1){ isReserveTime(time1830Text); } TextView time1900Text = view.findViewById(R.id.time_1900); if(data.getTime1900() == 1){ isReserveTime(time1900Text); } TextView time1930Text = view.findViewById(R.id.time_1930); if(data.getTime1930() == 1){ isReserveTime(time1930Text); } TextView time2000Text = view.findViewById(R.id.time_2000); if(data.getTime2000() == 1){ isReserveTime(time2000Text); } TextView time2030Text = view.findViewById(R.id.time_2030); if(data.getTime2030() == 1){ isReserveTime(time2030Text); } TextView time2100Text = view.findViewById(R.id.time_2100); if(data.getTime2100() == 1){ isReserveTime(time2100Text); } TextView time2130Text = view.findViewById(R.id.time_2130); if(data.getTime2130() == 1){ isReserveTime(time2130Text); } TextView time2200Text = view.findViewById(R.id.time_2200); if(data.getTime2200() == 1){ isReserveTime(time2200Text); } TextView time2230Text = view.findViewById(R.id.time_2230); if(data.getTime2230() == 1){ isReserveTime(time2230Text); } TextView time2300Text = view.findViewById(R.id.time_2300); if(data.getTime2300() == 1){ isReserveTime(time2300Text); } TextView time2330Text = view.findViewById(R.id.time_2330); if(data.getTime2330() == 1){ isReserveTime(time2330Text); } TextView time2400Text = view.findViewById(R.id.time_2400); if(data.getTime2400() == 1){ isReserveTime(time2400Text); } return view; } //選択状態とする private void isReserveTime(TextView tv){ //予約 tv.setBackgroundColor(getColor(R.color.btn_check_cl)); } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

色を変える処理をgetViewの外に出してみましたが解決しませんでした。

補足

ANDROID10

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

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

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

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

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

jimbe

2024/09/19 17:09 編集

>ListVewでスクロールを繰り返すと意図していない行の表示が変わる このような現象(?)は listview や recyclerview で良く発生して質問される類です。 コードをまだ見ていませんが、大抵は *要素のビューが使い回される* ことを前提に作られていないことが原因です。その辺りは大丈夫でしょうか。 例えば view の初期値が空と前提して値がある時だけ設定しているとか。使い回される時は view が空じゃ無いかもしれません。色なら初期値が白と前提して必要な時だけ色を付けていて、必要じゃない時に白に設定していないとか。 また、コードは出来るだけ現象を再現できる実行可能な一連のコード群をご提示ください。 一部だけでは実行して現象を確認したりデバッグする為に、想像で補ったりしなければなりません。
tanuki_

2024/09/20 04:10

コメントありがとうございます。ご指摘の部分を見直したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
jimbe

2024/09/20 04:19

お疲れ様です。 回答に書かせていただきました。
guest

回答1

0

ベストアンサー

ListVewでスクロールを繰り返すと意図していない行の表示が変わる

このような現象(?)は listview や recyclerview で良く発生して質問される類です。
コードをまだ見ていませんが、大抵は 要素のビューが使い回される ことを前提に作られていないことが原因です。その辺りは大丈夫でしょうか。
例えば view の初期値が空と前提して値がある時だけ設定しているとか。使い回される時は view が空じゃ無いかもしれません。色なら初期値が白と前提して必要な時だけ色を付けていて、必要じゃない時に白に設定していないとか。

投稿2024/09/20 04:18

jimbe

総合スコア13117

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

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

jimbe

2024/09/20 04:25

質問とは関係ありませんが、 view.findviewbyid は重めのメソッドとされており、ビューを表示する度に行うのはあまり良くありません。 毎回行うのを避ける方法として ViewHolder というものを作って使うのがほぼ?定石となっていますので、お時間ありましたら検索してみては如何でしょうか。
tanuki_

2024/09/20 06:30

ViewHolder 検索してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問