在 Recycler 列表视图中 ImageButton 的两种外观之间切换的最佳实践:setImageBitmap vs setImageResource vs setImageDrawable

Best practice for changing between two appearances of an ImageButton in Recycler List View: setImageBitmap vs setImageResource vs setImageDrawable

我是初学者,想知道 setImageBitmap 与 setImageResource 与 setImageDrawable 中的哪一个是在 Recycler 列表视图中的 ImageButton 的两种外观(状态)之间切换的最佳实践。就像 Android 的 AlarmClock 中的时钟符号一样,它有 2 种不同的状态并且位于 RecyclerView 中: 我需要 10 个声望才能 post 图片,所以这是一个带有警报列表图片的网站:https://www.pctipp.ch/androidtipp/artikel/android-coole-wecker-features-in-samsung-und-aehnlichen-smartphones-81200/

我已经为类似案例找到了可接受的答案:setImageResource Vs setDrawable 它说 setImageResource 可能是最糟糕的解决方案,但如果我采用其他解决方案,我的 ImageButton 就会出现问题,例如它会失去原来的大小。更重要的是,它看起来还需要做更多,例如 "decodeResource"。我认为这对它的性能不利,因为它对每一行都执行。 我知道 setImageDrawable 总是在 setImageBitmap 时被调用,所以我认为 setImageBitmap 不是正确的答案。

此代码是我的 RecyclerView 适配器中的 onBindViewHolder 的一部分:

if (alarmAtPosition.isActive()){
    //Bitmap bm = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.ic_access_alarms_black_24dp);
    Drawable myDrawable = Resources.getSystem().getDrawable(R.drawable.ic_access_alarms_black_24dp);
    viewHolder.imageButton.setImageDrawable(myDrawable);
//viewHolder.imageButton.setImageResource(R.drawable.ic_access_alarms_black_24dp);
}
else {
    //Bitmap bm2 = BitmapFactory.decodeResource(Resources.getSystem(), R.drawable.ic_settings_black_24dp);
    Drawable myDrawable2 = Resources.getSystem().getDrawable(R.drawable.ic_settings_black_24dp);
    viewHolder.imageButton.setImageDrawable(myDrawable2);
//viewHolder.imageButton.setImageResource(R.drawable.ic_settings_black_24dp);
}

在我的 row.xml 中,如果我使用 setImageResource,则不需要放入 android:src="@drawable/ic_settings_black_24dp。因此,采用这种解决方案对我来说会容易得多,但接受的答案让我不确定。请告诉我:哪一个性能最好?

我有一个更好的方法来切换图像(仅适用于 2 个州)。

创建一个 drawable 比方说 favourite.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_checked="true" android:drawable="@drawable/your_checked_drawable"/>
    <item android:drawable="@drawable/your_unchecked_drawable"/>

</selector>

现在,无论您添加了 imageButton 要更改图像的哪个位置,都将其替换为:

                <CheckBox
                    android:id="@+id/favourite"
                    android:button="@null"
                    android:checked="false"
                    android:clickable="true"
                    android:focusable="true"
                    android:background="@drawable/favourite"
                    android:layout_width="32dp"
                    android:layout_height="32dp" />

大功告成!

这基本上将默认的复选框可绘制对象更改为您的自定义可绘制对象,并且您有 2 个状态。

  1. checkbox.isChecked

  2. !checkbox.isChecked

编辑: 您可以将任何动画附加到复选框,我使用的是:

在 res/anim 下添加名为 scale.xml 的文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.7"
        android:toYScale="0.7"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="200"
        android:repeatMode="reverse"
        android:repeatCount="1"/>

</set>

然后在你的 activity:

private lateinit var mAnimation: Animation
mAnimation = AnimationUtils.loadAnimation(this, R.anim.scale)
checkbox.setOnClickListener {
     it.startAnimation(mAnimation)
}

好了。