如何解决Kotlin 必须在 imageview 上单击两次才能更改图标?
最近几天我遇到了一个问题。我试过在 Stackoverflow 上提问,但要么使用了太多不适合答案的代码,要么无法正确解释自己,所以最后一次尝试。我正在使用 Room/Kotlin 进行一个项目。我有一个 ImageView 有两个不同的可绘制对象,用于类似/不同的功能。我现在的问题是当单击 ImageView 时,drawable 需要单击两次才能显示“喜欢”,我还没有想到的是能够选择多个“收藏夹”并显示图标。多个收藏夹更像是一种需要,我只是想弄清楚它的要点。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:paddingBottom="@dimen/row_padding"
android:paddingLeft="@dimen/activity_margin"
android:paddingRight="@dimen/activity_margin"
android:paddingTop="@dimen/row_padding"
android:focusable="true">
<ImageButton
android:id="@+id/starPubs"
android:layout_width="@dimen/thumbnail"
android:layout_height="@dimen/thumbnail"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/row_padding"
android:focusable="false"
android:focusableInTouchMode="false"
android:background="@drawable/ic_star_outline" />
<TextView
android:id="@+id/pubNumber"
android:layout_toRightOf="@id/starPubs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-medium"
android:textColor="@color/pub_big_text"
android:textSize="@dimen/pub_name" />
<TextView
android:id="@+id/pubTitle"
android:layout_toRightOf="@id/starPubs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/pubNumber"
android:maxLines="2"
android:ellipsize="end"
android:textAllCaps="false"
android:fontFamily="@font/noto_sans"
android:textColor="@color/pub_little_text"
android:textSize="@dimen/pub_number" />
<TextView
android:id="@+id/pubLastAction"
android:layout_toRightOf="@id/starPubs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/pubTitle"
android:textAllCaps="false"
android:fontFamily="@font/noto_sans"
android:textColor="@color/pub_little_text"
android:textSize="@dimen/pub_last_action" />
<TextView
android:id="@+id/pubCertDate"
android:layout_toRightOf="@id/starPubs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/pubLastAction"
android:textAllCaps="false"
android:fontFamily="@font/noto_sans"
android:textColor="@color/pub_little_text"
android:textSize="@dimen/pub_last_action" />
</RelativeLayout>
```
package com.drewcodesit.afiexplorer.adapters
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
import android.widget.Filterable
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.drewcodesit.afiexplorer.Pubs
import com.drewcodesit.afiexplorer.R
import com.drewcodesit.afiexplorer.database.FavoriteEntity
import com.drewcodesit.afiexplorer.main.MainActivity
import es.dmoral.toasty.Toasty
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
/**
* Created by drewstephens on 5/13/2021.
*/
class MainAdapter(private val context: Context,private val pubsList: ArrayList<Pubs>,private val listener: PubsAdapterListener)
: RecyclerView.Adapter<MainAdapter.MyViewHolder>(),Filterable {
private var pubsListFiltered: ArrayList<Pubs>
init {
pubsListFiltered = pubsList
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.pub_row_item,parent,false)
return MyViewHolder(view)
}
@SuppressLint("SetTextI18n","SimpleDateFormat")
override fun onBindViewHolder(holder: MyViewHolder,position: Int) {
val publication = pubsListFiltered[position]
holder.starPubs.setonClickListener {
if (MainActivity.favoriteDatabase!!.favoriteDAO()!!.isFavorite(publication.id) == 1) holder.starPubs.setimageResource(R.drawable.ic_star_filled) else holder.starPubs.setimageResource(R.drawable.ic_star_outline)
val favoriteEntity = FavoriteEntity()
val id = publication.id
val number = publication.Number
val title = publication.Title
val url = publication.DocumentUrl
favoriteEntity.id = id
favoriteEntity.Number = number
favoriteEntity.Title = title
favoriteEntity.DocumentUrl = url
if (MainActivity.favoriteDatabase!!.favoriteDAO()!!.isFavorite(id) != 1) {
holder.starPubs.setimageResource(R.drawable.ic_star_filled)
MainActivity.favoriteDatabase!!.favoriteDAO()!!.addData(favoriteEntity)
Toasty.success(context,"Added to Favorites",Toasty.LENGTH_SHORT,true).show()
notifyItemChanged(holder.absoluteAdapterPosition)
notifyDataSetChanged()
} else {
//holder.starPubs.setimageResource(R.drawable.ic_star_outline)
//MainActivity.favoriteDatabase!!.favoriteDAO()!!.delete(favoriteEntity)
//MainActivity.favoriteDatabase!!.favoriteDAO()!!.deleteall()
//Toasty.info(context,"Removed from Favorites",Toasty.LENGTH_SHORT).show()
notifyItemRemoved(position)
notifyItemRangeChanged(holder.absoluteAdapterPosition,pubsListFiltered.size)
notifyDataSetChanged()
}
}
holder.also { h ->
with(publication) {
// Converts Milliseconds to Readable Date Format
// Certified Current Date from EPubs Site
val rawdate = CertDate
val calendar = Calendar.getInstance()
val datereip = rawdate.replace("/Date(","").replace(")/","")
val timeInMillis = java.lang.Long.valueOf(datereip)
calendar.timeInMillis = timeInMillis
// Converts Calendar Instance to
val certDate = SimpleDateFormat("MMM yyyy",Locale.getDefault()).format(Date(timeInMillis))
// Textfields
h.pub_number.text = Number
h.pub_title.text = Title
h.pub_last_action.text = "Last Action: $LastAction"
h.pub_cert_date.text = "Certified Current: $certDate"
}
}
}
override fun getItemCount(): Int {
return pubsListFiltered.size
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
return position
}
override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults {
val charString = constraint?.toString() ?: ""
pubsListFiltered = if (charString.isEmpty()) pubsList else {
val filteredList = ArrayList<Pubs>()
pubsList
.filter { it.Title!!.toLowerCase(Locale.ROOT).contains(charString.toLowerCase(Locale.ROOT)) or it.Number!!.contains(constraint!!) }
.forEach { filteredList.add(it) }
filteredList
}
return FilterResults().apply { values = pubsListFiltered }
}
override fun publishResults(constraint: CharSequence?,results: FilterResults?) {
pubsListFiltered = results?.values as ArrayList<Pubs>
notifyDataSetChanged()
}
}
}
inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var pub_number: TextView = view.findViewById(R.id.pubNumber)
var pub_title: TextView = view.findViewById(R.id.pubTitle)
var pub_last_action: TextView = view.findViewById(R.id.pubLastAction)
var pub_cert_date: TextView = view.findViewById(R.id.pubCertDate)
var starPubs: ImageView = view.findViewById(R.id.starPubs)
init {
view.setonClickListener {
listener.onPubsSelected(pubsListFiltered[bindingAdapterPosition])
}
}
}
interface PubsAdapterListener {
fun onPubsSelected(pubs: Pubs)
}
}
```
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。