【发布时间】:2023-03-25 08:38:02
【问题描述】:
我有两种情况可以在 recyclerview 中突出显示该项目第一个是当用户单击任何项目以便突出显示单击的项目时,第二个情况是当最后一个或最近的项目添加到列表中时,最后添加的项目应该突出显示。
所以我的第一个场景(onClick)工作正常,但问题出在我的第二个场景中,所以每当我将项目添加到列表中时,两个项目都会突出显示。请建议我哪里错了。还有一件最近或最后一项也应该执行自动点击的事情。那么我该如何实现呢。
class CarItemAdapter(
private val activity: MainActivity,
private val carList: ArrayList<CarEntity>,
private val carViewModel: CarViewModel,
private val settings: Settings
) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var listener: OnItemsClickListener? = null
var rowIndex = 100
var listItemCount = 0
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return when (viewType) {
VIEW_TYPE_ADDITEM -> ViewHolderAddCarItem(SettingsCarAddItemTileBinding.inflate(layoutInflater, parent, false))
VIEW_TYPE_ITEM -> ViewHolderCarItem(SettingsCarItemTileBinding.inflate(layoutInflater, parent, false))
else -> throw IllegalArgumentException("Invalid view type")
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ViewHolderCarItem -> holder.bind(carList[position -1], position-1)
is ViewHolderAddCarItem -> holder.bind()
}
}
inner class ViewHolderAddCarItem internal constructor(private var binding: SettingsCarAddItemTileBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind() {
binding.lifecycleOwner = activity
binding.handler = EventHandler()
binding.userSpecificCarSubtitle.setText(R.string.user_specific_car_subtitle)
}
inner class EventHandler {
fun onItemClicked() {
activity.showSubPage(Car360AddVehiclePage(activity), true)
}
}
}
inner class ViewHolderCarItem internal constructor(private var binding: SettingsCarItemTileBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(carEntity: CarEntity, position: Int) {
Timber.d("Data store position %s %s", position, carList.size)
listItemCount = itemCount
binding.lifecycleOwner = activity
val bmp = BitmapFactory.decodeByteArray(carEntity.image, 0, Objects.requireNonNull<ByteArray>(carEntity.image).size)
binding.carImage.setImageBitmap(bmp)
binding.carName.text = carEntity.label
binding.layoutCar.setOnClickListener {
listItemCount = 100
listener?.onItemClick(carEntity)
settings.finNumber = carEntity.finNumber
settings.selectedCarType = activity.getString(R.string.settings_category_view_sub_title_for_user_specific_car)
settings.isCarSelected = true
rowIndex = position
notifyDataSetChanged()
}
binding.deleteButton.setOnClickListener {
GlobalScope.launch(Dispatchers.IO) { carViewModel.deleteByFinNumber(carEntity.finNumber) }
carList.removeAt(position)
notifyDataSetChanged()
}
if(position == listItemCount-2){
binding.layoutCar.setBackgroundColor(activity.getColor(R.color.petrol))
binding.carName.setTextColor(activity.getColor(R.color.white))
}else{
binding.layoutCar.setBackgroundColor(activity.getColor(R.color.coolGray))
binding.carName.setTextColor(activity.getColor(R.color.coolGray_80k))
}
if (rowIndex == position) {
binding.layoutCar.setBackgroundColor(activity.getColor(R.color.petrol))
binding.carName.setTextColor(activity.getColor(R.color.white))
}
}
}
override fun getItemViewType(position: Int): Int {
return if (position == 0 && position <= carList.size) {
VIEW_TYPE_ADDITEM
} else VIEW_TYPE_ITEM
}
override fun getItemCount(): Int {
return carList.size + 1
}
interface OnItemsClickListener {
fun onItemClick(carEntity: CarEntity)
}
fun setWhenClickListener(listener: OnItemsClickListener) {
this.listener = listener
}
companion object {
const val VIEW_TYPE_ITEM = 0
const val VIEW_TYPE_ADDITEM = 1
}
}
MyFragmentSubPage :我将数据添加到列表中的位置
if (isDialogVisible) {
Dialog imageDownloadCheckDialog = Dialog.createProgressBarDialog(getContext(), R.string.image_progressbar_title);
imageDownloadCheckDialog.setCancelable(false);
imageDownloadCheckDialog.show();
carViewModel.getGetDismissDialog().observe(getActivity(), isDismissDialog -> {
if (isDismissDialog) {
imageDownloadCheckDialog.dismiss();
carViewModel.dismissDialog(false);
new Thread(() -> {
CarEntity carEntity = carViewModel.getImageFor340Degree(vinNumber, "340");
// Here I am adding data into the list
recyclerImageList.add(carEntity);
}).start();
}
});
}
RecyclerView recyclerView = binding.getRoot().findViewById(R.id.list);
if (recyclerView != null) {
layoutManager = new GridLayoutManager(getContext(), 2);
recyclerView.setLayoutManager(layoutManager);
}
carItemAdapter = new CarItemAdapter(getActivity(), recyclerImageList, eventHandler, carViewModel, settings);
assert recyclerView != null;
recyclerView.setAdapter(carItemAdapter);
recyclerView.getRecycledViewPool().setMaxRecycledViews(carItemAdapter.VIEW_TYPE_ITEM, 50);
【问题讨论】:
标签: android arraylist android-recyclerview adapter onclicklistener