Я вижу мерцание в моем представлении переработчика прямо вверху. Мерцание, похоже, напоминает верхние строки моих рисуемых фигур в файле item.xml представления recycler. Я внес различные коррективы в линии и другие вещи, чтобы увидеть, смогу ли я предотвратить мерцание, но, похоже, ничего не работает.
Вот мой код;
Активность
<?xml version = "1.0" encoding = "utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
tools:context = ".ScoreHistory">
<TextView
android:id = "@+id/textView_history_title"
android:layout_width = "match_parent"
android:layout_height = "60dp"
android:layout_marginStart = "16dp"
android:layout_marginTop = "16dp"
android:layout_marginEnd = "16dp"
android:gravity = "center|center_horizontal|center_vertical"
android:padding = "5dp"
android:text = "@string/GameHistory_Title"
android:textAlignment = "gravity"
android:textColor = "@color/lime"
android:textStyle = "bold"
app:autoSizeTextType = "uniform"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
<androidx.recyclerview.widget.RecyclerView
android:id = "@+id/RV_scorehistory"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toBottomOf = "@+id/textView_history_title" />
</androidx.constraintlayout.widget.ConstraintLayout>
Мой товар.xml
<?xml version = "1.0" encoding = "utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "55dp"
android:layout_marginLeft = "5dp"
android:layout_marginRight = "5dp"
android:background = "@drawable/rv_lines"
android:gravity = "center_vertical">
<TextView
android:id = "@+id/TV_RV_ID"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_margin = "0dp"
android:gravity = "center"
android:textAlignment = "center"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_DIFFICULTY"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "1"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
<TextView
android:id = "@+id/TV_RV_DIFFICULTY"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_marginStart = "2dp"
android:gravity = "center"
android:textAlignment = "center"
app:layout_constraintBaseline_toBaselineOf = "@+id/TV_RV_ID"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_SUMTYPE"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "4"
app:layout_constraintStart_toEndOf = "@+id/TV_RV_ID" />
<TextView
android:id = "@+id/TV_RV_SUMTYPE"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_marginStart = "2dp"
android:gravity = "center"
android:textAlignment = "center"
app:layout_constraintBaseline_toBaselineOf = "@+id/TV_RV_DIFFICULTY"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_OutOfText"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "3.5"
app:layout_constraintStart_toEndOf = "@+id/TV_RV_DIFFICULTY" />
<TextView
android:id = "@+id/TV_RV_OutOfText"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_marginStart = "2dp"
android:gravity = "center"
android:text = "@string/score_text"
app:layout_constraintBaseline_toBaselineOf = "@+id/TV_RV_SUMTYPE"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_SCORE"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "2"
app:layout_constraintStart_toEndOf = "@+id/TV_RV_SUMTYPE" />
<TextView
android:id = "@+id/TV_RV_SCORE"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_marginStart = "6dp"
android:gravity = "center"
android:textAlignment = "center"
android:textStyle = "bold"
app:layout_constraintBaseline_toBaselineOf = "@+id/TV_RV_OutOfText"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_QCOUNT_TEXT"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "1.5"
app:layout_constraintStart_toEndOf = "@+id/TV_RV_OutOfText" />
<TextView
android:id = "@+id/TV_RV_QCOUNT_TEXT"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_marginStart = "2dp"
android:gravity = "center"
android:text = "@string/questions_text"
android:textAlignment = "gravity"
android:textStyle = "bold"
app:layout_constraintBaseline_toBaselineOf = "@+id/TV_RV_SCORE"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_QCOUNT"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = ".75"
app:layout_constraintStart_toEndOf = "@+id/TV_RV_SCORE" />
<TextView
android:id = "@+id/TV_RV_QCOUNT"
android:layout_width = "0dp"
android:layout_height = "match_parent"
android:layout_marginStart = "2dp"
android:background = "@drawable/target_icon"
android:gravity = "center"
android:textAlignment = "center"
android:textStyle = "bold"
app:layout_constraintBaseline_toBaselineOf = "@+id/TV_RV_QCOUNT_TEXT"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "1.5"
app:layout_constraintStart_toEndOf = "@+id/TV_RV_QCOUNT_TEXT" />
</androidx.constraintlayout.widget.ConstraintLayout>
Я устанавливаю фоновые ресурсы здесь, в моем адаптере
class ScoreHistoryAdaptor : ListAdapter<SavedScores, ScoreHistoryAdaptor.SavedScoreViewHolder>(WordsComparator()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SavedScoreViewHolder {
return SavedScoreViewHolder.create(parent)
}
override fun onBindViewHolder(holder: SavedScoreViewHolder, position: Int) {
val current = getItem(position)
holder.bind(current.id,current.difficulty,current.sumtype,current.questioncount,current.answeredcorrectly)
}
class SavedScoreViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val IDItemView: TextView = itemView.findViewById(R.id.TV_RV_ID)
private val DiffultyItemView: TextView = itemView.findViewById(R.id.TV_RV_DIFFICULTY)
private val SumTypeItemView: TextView = itemView.findViewById(R.id.TV_RV_SUMTYPE)
private val qCountItemView: TextView = itemView.findViewById(R.id.TV_RV_QCOUNT)
private val ScoreItemView: TextView = itemView.findViewById(R.id.TV_RV_SCORE)
private var DIFFCODE = ""
private var SUMTYPECODE = ""
val myContext = SumTypeItemView.context
fun bind(ID: Int?,DIFFICULTY:String?,SUMTYPE:String?,QC:Int?,SCORE:Int?) {
IDItemView.text = ID.toString()
when (DIFFICULTY) {
myContext.resources.getString(R.string.diffLVL1) -> {DIFFCODE = DIFFICULTY; DiffultyItemView.setBackgroundResource(R.drawable.diff_easy_icon)}
myContext.resources.getString(R.string.diffLVL2) -> {DIFFCODE = DIFFICULTY ; DiffultyItemView.setBackgroundResource(R.drawable.diff_normal_icon)}
myContext.resources.getString(R.string.diffLVL3) -> {DIFFCODE = DIFFICULTY; DiffultyItemView.setBackgroundResource(R.drawable.diff_hard_icon) }
myContext.resources.getString(R.string.diffLVL4) -> {DIFFCODE = DIFFICULTY ; DiffultyItemView.setBackgroundResource(R.drawable.diff_impossible_icon)}
myContext.resources.getString(R.string.random) -> {DIFFCODE = DIFFICULTY ; DiffultyItemView.setBackgroundResource(R.drawable.diff_random_icon)}
}
DiffultyItemView.text = DIFFCODE
when (SUMTYPE) {
myContext.resources.getString(R.string.catMulti) -> {SUMTYPECODE = myContext.resources.getString(R.string.multi_symbol) }
myContext.resources.getString(R.string.catAdd) -> {SUMTYPECODE = myContext.resources.getString(R.string.add_symbol)}
myContext.resources.getString(R.string.catSub) -> {SUMTYPECODE = myContext.resources.getString(R.string.sub_symbol)}
myContext.resources.getString(R.string.catDiv) -> {SUMTYPECODE = myContext.resources.getString(R.string.div_symbol)}
myContext.resources.getString(R.string.catSqrR) -> {SUMTYPECODE = myContext.resources.getString(R.string.sqr_symbol) + "n"}
myContext.resources.getString(R.string.catSqrD) -> {SUMTYPECODE = "n" + myContext.resources.getString(R.string.sqrd_symbol)}
myContext.resources.getString(R.string.catCubeR) -> {SUMTYPECODE = myContext.resources.getString(R.string.cuber_symbol) + "n"}
myContext.resources.getString(R.string.catCubeD) -> {SUMTYPECODE = "n" + myContext.resources.getString(R.string.cubed_symbol)}
myContext.resources.getString(R.string.random) -> {SUMTYPECODE = myContext.resources.getString(R.string.random)}
}
when (IsScoreLessThanTarget(SCORE!!.toInt(),QC!!.toInt())){
true ->{ScoreItemView.setBackgroundResource(R.drawable.somewrong_icon)}
false ->{ScoreItemView.setBackgroundResource(R.drawable.allcorrect_icon)}
}
SumTypeItemView.setBackgroundResource(R.drawable.sumtype_icon)
SumTypeItemView.text = SUMTYPECODE
qCountItemView.text = QC.toString()
ScoreItemView.text = SCORE.toString()
}
companion object {
fun create(parent: ViewGroup): SavedScoreViewHolder {
val view: View = LayoutInflater.from(parent.context)
.inflate(R.layout.row_item, parent, false)
return SavedScoreViewHolder(view)
}
}
}
class WordsComparator : DiffUtil.ItemCallback<SavedScores>() {
override fun areItemsTheSame(oldItem: SavedScores, newItem: SavedScores): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: SavedScores, newItem: SavedScores): Boolean {
return oldItem == newItem
}
}
}
private fun IsScoreLessThanTarget(score:Int,target:Int): Boolean{
return score < target
}
В другом представлении с использованием прокрутки я получаю то же самое
@Harsh0021 добавил картинку. И когда вы прокручиваете его, он мерцает, и, как я сказал выше, он напоминает верхнюю часть рисунков из предметов.
Что вы имели в виду под мерцанием. Не могли бы вы рассказать мне об этом?
@ Hardh0021 это означает, что когда вы прокручиваете его, строки, которые вы видите, мерцают неуместно. Появляются и быстро исчезают. Как мерцание. Я не могу описать это лучше, потому что мерцание — это слово, используемое для его описания: / и это не обязательно быстрая прокрутка. Я могу прокручивать только миллиметр за раз, и он все еще мерцает
Найдите, где вы берете.
@Harsh0021 в верхней части окна переработчика ниже, где написано «История». Частичные строки
Давайте продолжим обсуждение в чате.
Вы пробовали это на других телефонах, и это эмулятор, который вы тестируете?
@Harsh0021 У меня есть только одно физическое устройство для тестирования, которое я и использую. Неиспользуемый эмулятор
попробуйте использовать другие устройства. Может проблема в телефоне или еще в чем
@Harsh0021 Я предполагаю, что это зависит от устройства, поскольку мне удалось протестировать два разных устройства Samsung, и я не смог воспроизвести проблему. Но на моем хафуре (не говори так....) все равно бывает. Хотел бы я все еще понять причину ... Я уверен, что у других людей есть мусорные устройства, такие как я, лол.
тогда ставь галочку и баунти😉😉😉😉
@Harsh0021 Я не считаю это решенным. Проблема все еще существует на моем устройстве и, возможно, на многих других, которые я не смог проверить. Но поскольку вы приложили усилия, чтобы пообщаться со мной по этому вопросу, я отмечу ваш, если вы включите комментарии, которые я сделал в свой ответ (не решенный, а специфичный для устройства). И если вы хотите взглянуть... Мне нужна помощь и здесь: codereview.stackexchange.com/questions/253777/…
@Harsh0021 Награду можно получить за 7 часов, по-видимому.
Попробуйте добавить немного отступов в вид переработчика сверху.
@Prashant.J, не могли бы вы опубликовать свой комментарий в качестве ответа, пожалуйста. И мой вид прокрутки, и вид повторного использования с верхним и нижним отступом 5dp предотвращают мерцание.
Вы выполняете много работы в своем onBind, загружаете фоны и устанавливаете их в представлениях, и некоторые из них не нужны, например, вам нужно переместить SumTypeItemView.setBackgroundResource(R.drawable.sumtype_icon) из вашей функции привязки
Чем больше я смотрю на ваш код, тем больше проблем с производительностью я вижу в нем, вы используете ресурсы из R.string с помощью when, что, как я полагаю, снижает производительность вашего ресайклера.
У меня есть предложение для вас, прокомментируйте все строки в функции привязки, установите фон в вашем My_item.xml для ваших текстовых представлений, запустите свой код и проверьте результат, скажите мне, видите ли вы все еще мерцание или нет.
также опубликуйте свои SavedScores , тогда я смогу проверить ваш класс данных и как-то улучшить его.
@feridok как установить переменный фон непосредственно в файле макета xml? Я добавлю свой класс данных. Просто чтобы сообщить, как комментарий от Prashant padding исправил мою проблему. И как новичок я не сомневаюсь, что может быть много улучшений. Поскольку вы предлагаете помочь мне с данными, пожалуйста, смотрите этот пост вместо этого codereview.stackexchange.com/questions/253777/…
не переменная, установите фиксированную, чтобы проверить, вызвана ли задержка/мерцание логикой привязки или нет.
@fedirok Я не уверен, что это был просто адаптер, поскольку у меня есть прокрутка, где это также происходит, и это не проходит через адаптер. В дополнение к этому, отступы вверху и внизу либо recyclerview, либо scrollview действительно решили проблему, которую я подтвердил. Я не отрицаю возможность установки такого количества ресурсов, являющихся причиной проблемы в любом месте. Мое приложение должно обеспечивать различные визуальные эффекты в зависимости от предоставленных значений, поэтому мне все еще нужно иметь возможность достичь этого результата.
@UnknownError Я считаю, что это можете исправить только вы. Есть много движущихся частей, поэтому вы должны минимизировать проблему, насколько это возможно. Закомментируйте основные части кода, чтобы поэкспериментировать только с одним типом представления. Попробуйте использовать match_parent вместо wrap_content для корневого ограничения. Уменьшите данные, чтобы recyclerview немного прокручивался. Попробуйте LinearLayout вместо ограничения, попробуйте ограничение с атрибутом цепочки. В общем, разделяй и властвуй. Также некоторые TextViews имеют другое textAlignment. Лично я подозреваю, что проблема связана с высотой макета.
@nkhar смотрите все предыдущие комментарии. Я уже несколько раз заявлял, что прашантский комментарий дал правильный результат. Выравнивание текста происходит, как и ожидалось, на больших и маленьких экранах как в портретной, так и в горизонтальной ориентации. Я разместил ссылку выше на другой пост, связанный с данными и представлениями. Если вы хотите просмотреть это, это будет полезно, поскольку цель этого поста — попытаться уменьшить количество просмотров и количество отдельных точек данных. Сокращение данных не является решением (ЭТО НИКОГДА НЕ ДОЛЖНО БЫТЬ), но помощь в уточнении способа доступа к данным и их отображения была бы очень признательна.
Ваша проблема возникает, потому что в вашем my_item.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "55dp" <---- Fixed Height
android:layout_marginLeft = "5dp"
android:layout_marginRight = "5dp"
android:background = "#ae7f9c"
android:gravity = "center_vertical">
и в ваших текстовых представлениях, подобных этому,
<TextView
android:id = "@+id/TV_RV_ID"
android:layout_width = "0dp"
android:layout_height = "match_parent" <------ this hiding the background try using wrap_content
android:layout_margin = "0dp"
android:gravity = "center"
android:textAlignment = "center"
app:layout_constraintEnd_toStartOf = "@+id/TV_RV_DIFFICULTY"
app:layout_constraintHorizontal_bias = "0.5"
app:layout_constraintHorizontal_weight = "1"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
Чтобы решить эту проблему,
my_item.xml
, используйте wrap_content
constaintlayout
android:layout_height = "wrap_content"
к своим текстовым представлениям и center_vertical
их,тогда ваша проблема будет решена, надеюсь, это поможет
попробуйте не задавать фиксированную высоту для контейнера
Добавьте скриншот того, что вы видите!