单击 Android 时,RecyclerView 正在选择多个项目
RecyclerView is Selecting more than one item when click in Android
我正在使用 RecyclerView,问题是当点击一个项目时它变成 selected.after 当点击第二个项目时,第一个和第二个项目同时被选中。
点击代码:
init {
itemView.setOnClickListener {
modesList[adapterPosition].isSelected = true
val modelWrapper = modesList[adapterPosition]
val formatModel = modelWrapper.mode
itemListener.recyclerViewListClicked(
formatModel,
formatModel.getId(),
formatModel.modeName,
formatModel.modeName_Number,
formatModel.modeBrightnessProgressBar,
formatModel.modeSpeedProgressBar,
formatModel.colorValues,
adapterPosition
)
}
您必须在 Recycler Adapter 中声明 itemid 和 itemviewtype 才能解决这个问题。
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
您应该在适配器中获取项目的位置并将其传递给 activity 或片段,然后简单地完成您的工作。
在这里你可以看到一个例子。
class MyAdapter : RecyclerView.Adapter<MyAdapter.MyAdapterViewHolder>() {
inner class MyAdapterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
private val differCallback = object : DiffUtil.ItemCallback<Item>() {
override fun areItemsTheSame(oldItem: YourEntityObject, newItem: YourEntityObject): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: YourEntityObject, newItem: YourEntityObject): Boolean {
return oldItem == newItem
}
}
val differ = AsyncListDiffer(this, differCallback)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapterViewHolder{
return MyAdapterViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false))
}
override fun getItemCount(): Int {
return differ.currentList.size
}
private var onItemClickListener: ((YourEntityObject) -> Unit)? = null
override fun onBindViewHolder(holder: MyAdapterViewHolder, position: Int) {
val info = differ.currentList[position]
holder.itemView.apply {
setOnClickListener {
onItemClickListener?.let { it(repoInfo) }
}
}
}
fun setOnItemClickListener(listener: (YourEntityObject) -> Unit) {
onItemClickListener = listener
}
}
- 现在在你的片段中只需简单地写如下。
private lateinit var myAdapter: MyAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
adapterOperation()
}
private fun adapterOperation() {
with(myAdapter) {
setOnItemClickListener {
toast(it.your_entity_property)// for example toast the name of list item
}
}
}
private fun setupRecyclerView() {
adapter = MyAdapter()
your_recyclerveiw.apply {
adapter = myAdapter
layoutManager = LinearLayoutManager(activity)
}
}
}
我正在使用 RecyclerView,问题是当点击一个项目时它变成 selected.after 当点击第二个项目时,第一个和第二个项目同时被选中。 点击代码:
init {
itemView.setOnClickListener {
modesList[adapterPosition].isSelected = true
val modelWrapper = modesList[adapterPosition]
val formatModel = modelWrapper.mode
itemListener.recyclerViewListClicked(
formatModel,
formatModel.getId(),
formatModel.modeName,
formatModel.modeName_Number,
formatModel.modeBrightnessProgressBar,
formatModel.modeSpeedProgressBar,
formatModel.colorValues,
adapterPosition
)
}
您必须在 Recycler Adapter 中声明 itemid 和 itemviewtype 才能解决这个问题。
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
您应该在适配器中获取项目的位置并将其传递给 activity 或片段,然后简单地完成您的工作。
在这里你可以看到一个例子。
class MyAdapter : RecyclerView.Adapter<MyAdapter.MyAdapterViewHolder>() {
inner class MyAdapterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
private val differCallback = object : DiffUtil.ItemCallback<Item>() {
override fun areItemsTheSame(oldItem: YourEntityObject, newItem: YourEntityObject): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: YourEntityObject, newItem: YourEntityObject): Boolean {
return oldItem == newItem
}
}
val differ = AsyncListDiffer(this, differCallback)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapterViewHolder{
return MyAdapterViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false))
}
override fun getItemCount(): Int {
return differ.currentList.size
}
private var onItemClickListener: ((YourEntityObject) -> Unit)? = null
override fun onBindViewHolder(holder: MyAdapterViewHolder, position: Int) {
val info = differ.currentList[position]
holder.itemView.apply {
setOnClickListener {
onItemClickListener?.let { it(repoInfo) }
}
}
}
fun setOnItemClickListener(listener: (YourEntityObject) -> Unit) {
onItemClickListener = listener
}
}
- 现在在你的片段中只需简单地写如下。
private lateinit var myAdapter: MyAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
adapterOperation()
}
private fun adapterOperation() {
with(myAdapter) {
setOnItemClickListener {
toast(it.your_entity_property)// for example toast the name of list item
}
}
}
private fun setupRecyclerView() {
adapter = MyAdapter()
your_recyclerveiw.apply {
adapter = myAdapter
layoutManager = LinearLayoutManager(activity)
}
}
}