Android Studio – Java – сложность выделения цвета фона элемента ListView ⇐ JAVA
-
Гость
Android Studio – Java – сложность выделения цвета фона элемента ListView
Введение:
Я столкнулся с проблемой выделения цвета фона элементов ListView в моем приложении для Android. Несмотря на мои попытки программно изменить цвет фона, изменения не отражаются в пользовательском интерфейсе.
Описание проблемы:
Я пытаюсь динамически изменить цвет фона элементов ListView в зависимости от определенных условий, например соответствия определенному названию песни. Однако, хотя мой код выполняется без ошибок и журналы показывают, что логика сопоставления работает правильно, пользовательский интерфейс не отражает изменения. Цвет фона остается неизменным.
Инициализация ListView и Адаптера:
ListView songListView = findViewById(R.id.songsListView); SongsAdapter songAdapter = новый SongsAdapter (контекст, SongNames); songListView.setAdapter(songsAdapter); Попытка изменить цвет фона в цикле:
// Находим и выделяем песню с помощью адаптера for (int i = 0; i < songAdapter.getCount(); i++) { Строка tempSongName = songAdapter.getItem(i); // Записываем информацию о песне Log.d("SttList", "(SetListMasterViewActivity) строка № 222 - ChildViewInfo - Индекс дочернего представления: " + i); Log.d("SttList", "(SetListMasterViewActivity) строка № 223 - ChildViewInfo - tempSongName: " + tempSongName + ", LastViewedSongName: " + (i + 1) + ") " + LastViewedSongName); // Проверяем, соответствует ли название песни последнему просматриваемому названию песни if (tempSongName != null && tempSongName.equalsIgnoreCase((i + 1) + ") " +lastViewedSongName)) { // Выделяем соответствующий элемент ListView Просмотр childView = songAdapter.getView(i, null, songListView); если (childView экземпляр TextView) { TextView textView = (TextView) childView; textView.setBackgroundColor(Color.YELLOW); // Регистрируем совпадение Log.d("SttList", "(SetListMasterViewActivity) строка № 226 - ChildViewInfo - найдено совпадение для песни: " +lastViewedSongName); // Выходим из цикла, как только совпадение найдено перерыв; } } } xml:
В моем классе адаптера — SongListAdapter:
@Override public View getView (int Position, View ConvertView, родительский элемент ViewGroup) { если (convertView == ноль) { ConvertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_song, родительский, false); } // Получаем элемент для этой позиции Строка songName = getItem(позиция); // Находим представления в макете TextView itemNumberTextView = ConvertView.findViewById(R.id.itemNumberTextView); TextView songNameTextView = ConvertView.findViewById(R.id.songNameTextView); // Устанавливаем номер песни itemNumberTextView.setText((position + 1) + ")"); // Устанавливаем название песни имя_песниTextView.setText(имя_песни); // Устанавливаем цвет фона int backgroundColor = mBackgroundColors.get(позиция, 0); // По умолчанию прозрачно ConvertView.setBackgroundColor(backgroundColor); вернуть конвертвиев; } Я пробовал:
Пытаюсь изменить цвет фона из класса Adapter:
public void updateItemBackground(intposition, int color) { mBackgroundColors.put(позиция, цвет); уведомитьDataSetChanged(); } и вызываю этот метод из моего цикла:
if (childView экземпляр TextView) { адаптер.updateItemBackground(i, Color.YELLOW); // Регистрируем совпадение Log.d("SttList", "(SetListMasterViewActivity) строка № 226 — ChildViewInfo — найдено совпадение для песни: " + LastViewedSongName); // Выходим из цикла, как только совпадение найдено перерыв; } Но я получил ошибку NullPointerException. Вот данные Logcat из ошибки:
E ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main Процесс: com.enetapplications.songtracker, PID: 5719. java.lang.RuntimeException: сбой при доставке результата ResultInfo{who=null, request=614906370, result=-1, data=Intent { (есть дополнительные возможности) }} для действия {com.enetapplications.songtracker/com.enetapplications.songtracker.opensetlist .SetListMasterViewActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод «void com.enetapplications.songtracker.opensetlist.SongListAdapter.updateItemBackground(int, int)» по нулевой ссылке на объект в android.app.ActivityThread.deliverResults(ActivityThread.java:5864) в android.app.ActivityThread.handleSendResult(ActivityThread.java:5903) в android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) в android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438) в android.os.Handler.dispatchMessage(Handler.java:106) в android.os.Looper.loopOnce(Looper.java:226) в android.os.Looper.loop(Looper.java:313) в android.app.ActivityThread.main(ActivityThread.java:8663) в java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод «void com.enetapplications.songtracker.opensetlist.SongListAdapter.updateItemBackground(int, int)» для нулевой ссылки на объект на com.enetapplications.songtracker.opensetlist.SetListMasterViewActivity.onActivityResult(SetListMasterViewActivity.java:238) в android.app.Activity.dispatchActivityResult(Activity.java:8659) в android.app.ActivityThread.deliverResults(ActivityThread.java:5857) Спасибо, что читаете!
Введение:
Я столкнулся с проблемой выделения цвета фона элементов ListView в моем приложении для Android. Несмотря на мои попытки программно изменить цвет фона, изменения не отражаются в пользовательском интерфейсе.
Описание проблемы:
Я пытаюсь динамически изменить цвет фона элементов ListView в зависимости от определенных условий, например соответствия определенному названию песни. Однако, хотя мой код выполняется без ошибок и журналы показывают, что логика сопоставления работает правильно, пользовательский интерфейс не отражает изменения. Цвет фона остается неизменным.
Инициализация ListView и Адаптера:
ListView songListView = findViewById(R.id.songsListView); SongsAdapter songAdapter = новый SongsAdapter (контекст, SongNames); songListView.setAdapter(songsAdapter); Попытка изменить цвет фона в цикле:
// Находим и выделяем песню с помощью адаптера for (int i = 0; i < songAdapter.getCount(); i++) { Строка tempSongName = songAdapter.getItem(i); // Записываем информацию о песне Log.d("SttList", "(SetListMasterViewActivity) строка № 222 - ChildViewInfo - Индекс дочернего представления: " + i); Log.d("SttList", "(SetListMasterViewActivity) строка № 223 - ChildViewInfo - tempSongName: " + tempSongName + ", LastViewedSongName: " + (i + 1) + ") " + LastViewedSongName); // Проверяем, соответствует ли название песни последнему просматриваемому названию песни if (tempSongName != null && tempSongName.equalsIgnoreCase((i + 1) + ") " +lastViewedSongName)) { // Выделяем соответствующий элемент ListView Просмотр childView = songAdapter.getView(i, null, songListView); если (childView экземпляр TextView) { TextView textView = (TextView) childView; textView.setBackgroundColor(Color.YELLOW); // Регистрируем совпадение Log.d("SttList", "(SetListMasterViewActivity) строка № 226 - ChildViewInfo - найдено совпадение для песни: " +lastViewedSongName); // Выходим из цикла, как только совпадение найдено перерыв; } } } xml:
В моем классе адаптера — SongListAdapter:
@Override public View getView (int Position, View ConvertView, родительский элемент ViewGroup) { если (convertView == ноль) { ConvertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_song, родительский, false); } // Получаем элемент для этой позиции Строка songName = getItem(позиция); // Находим представления в макете TextView itemNumberTextView = ConvertView.findViewById(R.id.itemNumberTextView); TextView songNameTextView = ConvertView.findViewById(R.id.songNameTextView); // Устанавливаем номер песни itemNumberTextView.setText((position + 1) + ")"); // Устанавливаем название песни имя_песниTextView.setText(имя_песни); // Устанавливаем цвет фона int backgroundColor = mBackgroundColors.get(позиция, 0); // По умолчанию прозрачно ConvertView.setBackgroundColor(backgroundColor); вернуть конвертвиев; } Я пробовал:
Пытаюсь изменить цвет фона из класса Adapter:
public void updateItemBackground(intposition, int color) { mBackgroundColors.put(позиция, цвет); уведомитьDataSetChanged(); } и вызываю этот метод из моего цикла:
if (childView экземпляр TextView) { адаптер.updateItemBackground(i, Color.YELLOW); // Регистрируем совпадение Log.d("SttList", "(SetListMasterViewActivity) строка № 226 — ChildViewInfo — найдено совпадение для песни: " + LastViewedSongName); // Выходим из цикла, как только совпадение найдено перерыв; } Но я получил ошибку NullPointerException. Вот данные Logcat из ошибки:
E ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main Процесс: com.enetapplications.songtracker, PID: 5719. java.lang.RuntimeException: сбой при доставке результата ResultInfo{who=null, request=614906370, result=-1, data=Intent { (есть дополнительные возможности) }} для действия {com.enetapplications.songtracker/com.enetapplications.songtracker.opensetlist .SetListMasterViewActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод «void com.enetapplications.songtracker.opensetlist.SongListAdapter.updateItemBackground(int, int)» по нулевой ссылке на объект в android.app.ActivityThread.deliverResults(ActivityThread.java:5864) в android.app.ActivityThread.handleSendResult(ActivityThread.java:5903) в android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) в android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) в android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) в android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) в android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438) в android.os.Handler.dispatchMessage(Handler.java:106) в android.os.Looper.loopOnce(Looper.java:226) в android.os.Looper.loop(Looper.java:313) в android.app.ActivityThread.main(ActivityThread.java:8663) в java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод «void com.enetapplications.songtracker.opensetlist.SongListAdapter.updateItemBackground(int, int)» для нулевой ссылки на объект на com.enetapplications.songtracker.opensetlist.SetListMasterViewActivity.onActivityResult(SetListMasterViewActivity.java:238) в android.app.Activity.dispatchActivityResult(Activity.java:8659) в android.app.ActivityThread.deliverResults(ActivityThread.java:5857) Спасибо, что читаете!
Мобильная версия