Предотвратить прозрачность кнопки при выборе - PullRequest
0 голосов
/ 06 июня 2018

У меня есть recyclerview, у которого есть ряд кнопок.Моя цель - сделать так, чтобы текущая выбранная кнопка имела текст темно-синего цвета, в то время как остальные имеют текст серого цвета.

Для этого в моем классе TabAdapter есть следующий код:

class TabAdapter(private val items: ArrayList<Pair<String, ArrayList<String>>>, private val context: Context) : RecyclerView.Adapter<TabViewHolder>() {
private var selectedPosition: Int = RecyclerView.NO_POSITION

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TabViewHolder {
    return TabViewHolder(LayoutInflater.from(context).inflate(R.layout.tabrecycler_item_column, parent, false))
}

override fun getItemCount(): Int {
    return items.size
}

override fun onBindViewHolder(holder: TabViewHolder, position: Int) {

    context as AnimeFaceKeyboard

    holder.itemView.isSelected = selectedPosition == position

    if (holder.itemView.isSelected) {
        holder.button.setTextColor(ContextCompat.getColor(context, R.color.material_deep_teal_200))
    } else {
        holder.button.setTextColor(ContextCompat.getColor(context, R.color.material_grey_600))
    }


    //This code sets the widths of the buttons to, at minimum,
    //occupy the entire width of the screen combined 
    val displayMetrics = Resources.getSystem().displayMetrics

    if (itemCount * (120 * displayMetrics.density) < displayMetrics.widthPixels) {
        holder.button.width = displayMetrics.widthPixels / itemCount
    }


    holder.button.text = items[position].first
    holder.button.setOnClickListener {

        //TODO - Figure out how this code works
        notifyItemChanged(selectedPosition)
        selectedPosition = holder.layoutPosition
        notifyItemChanged(selectedPosition)

        //This code updates a different recyclerview. 
        context.isFavoritesTabSelected = position == items.lastIndex
        context.updateCurrentImageLayout(items[position].second)
    }
}

}
class TabViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val button: Button = view.tabButton

}

Соответствующие строки в методе onBindViewHolder.В частности, эта строка

holder.itemView.isSelected = selectedPosition == position

и этот код в методе onClick для кнопок

        notifyItemChanged(selectedPosition)
        selectedPosition = holder.layoutPosition
        notifyItemChanged(selectedPosition)

Также приведена схема расположения кнопок в recyclerview:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/tabButton"
        android:layout_width="match_parent"
        android:minWidth="120dp"
        android:layout_height="match_parent"
        android:text="Unset-Button-Text"
        android:background="@color/darkshade"
        style="@style/Widget.AppCompat.Button.Borderless"/>


</android.support.constraint.ConstraintLayout>

Поведение моего recyclerView является частично функциональным.Текст выбранной в данный момент кнопки, на самом деле, окрашен в чирок.

Однако есть две проблемы

1] Кнопки становятся частично прозрачными при нажатии.Что-то должно быть не так с анимацией пульсации при нажатии

и

2] Предполагается, что анимация пульсации воспроизводится только для текущей выбранной кнопки, но она также воспроизводится для ранеевыбранная кнопка.

Вот GIF из моего телефона для демонстрации:

Video_Of_Phone

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Прочитав ответ @ Shashwat, я решил проблему, изменив цвет фона recyclerview на тот же цвет, что и у кнопок.

Это означает, что даже если адаптер воссоздает кнопку с нуля,нет исчезновения и исчезновения.

0 голосов
/ 06 июня 2018

Из вашего кода эти строки вызывают проблему

    notifyItemChanged(selectedPosition)
    selectedPosition = holder.layoutPosition
    notifyItemChanged(selectedPosition)

Ранее выбранная кнопка мигает, потому что вы вызываете notifyItemChanged(), чтобы отменить ее выбор, и адаптер воссоздает ее с нуля, чтобы обновитьЭто.Затем то же самое происходит с текущей выбранной кнопкой, воссозданной с нуля для обновления изменений в пользовательском интерфейсе.

Вы можете попробовать реализовать TabLayout, потому что подобный макет будет работать лучше, если вы используете вкладки вместо RecylerView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...