android - 在revylerview中调用notifyDataSetChanges方法后如何保持recyclerview的位置?
问题描述
我试图在给定位置显示图像,单击该项目后该位置不可见。这就是我保留int数组的原因。我给点击位置 1 和其他 0。检查后我使第一个可见而另一个不可见并调用 notifyDataSetChangesethod。recyclerviews 滚动到 0 位置。我希望它保持在相同的位置而不改变。
类 HitParadeAdapter(私有 val 模型:MutableList,私有 val 上下文:上下文,私有 val callBack:HitParadListener):RecyclerView.Adapter(){
private var isPlay = false
private var listName = mutableListOf<String>()
private var listSort = mutableListOf<Voting_tracks>()
private val selectedItems = IntArray(models.size)
private fun setSelectedItem(position: Int) {
for (i in selectedItems.indices) {
if (i == position)
selectedItems[i] = 1
else
selectedItems[i] = 0
}
}
interface HitParadListener{
fun itemClick(position: Int)
}
init {
Log.d("Testing", "${models.size}")
for (i in models.indices){
listName.add(models[i].name)
}
sort(listName)
for (i in listName.indices){
Log.d("Sort", listName[i])
}
for (i in models.indices){
for (j in models.indices){
if (listName[i] == models[j].name){
listSort.add(models[j])
break
}
}
}
models.clear()
models.addAll(listSort)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ParadeViewHolder {
return ParadeViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_parade,
parent,
false
)
)
}
override fun getItemCount(): Int {
return models.size
}
override fun onBindViewHolder(holder: ParadeViewHolder, position: Int) {
if(selectedItems[position] == 1) holder.play.visibility = View.VISIBLE
else holder.play.visibility = View.INVISIBLE
holder.track.text = models[position].name
holder.artist.text = models[position].artists[0].name
if (models[position].picture_path != "") {
Picasso.get().load("http://rusradio.test-rmg.ru${models[position].picture_path}")
.into(holder.image)
}
holder.like.setOnClickListener {
holder.sendVariants(1)
}
holder.disLike.setOnClickListener {
holder.sendVariants(1)
}
holder.itemView.setOnClickListener {
val positions = holder.adapterPosition
if (positions != RecyclerView.NO_POSITION) {
setSelectedItem(positions)
notifyDataSetChanged()
callBack.itemClick(position)
}
}
}
inner class ParadeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val getUsers: GetList = createService()
val image: AppCompatImageView = itemView.Image
val artist: AppCompatTextView = itemView.Artist
val track: AppCompatTextView = itemView.track
val play: AppCompatImageView = itemView.image_play
val like: AppCompatImageView = itemView.imageLike
val disLike: AppCompatImageView = itemView.imageDisLike
解决方案
recyclerViewState = RecyclerView.getLayoutManager().onSaveInstanceState();
adapter.notifyDataSetChanged();
recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);
推荐阅读
- android - HTTPS 证书更新后无法从 Android 应用程序访问网站
- python - 有没有办法添加两个具有恒定时间复杂度的列表或数组的元素?
- javascript - 用Javascript中的键值对展平嵌套数组
- r - Rborist 0.1-17 版在 Windows 中不断崩溃 R 会话
- python - 为什么我不能为递归二分搜索函数设置默认参数?
- vue.js - 使用按钮展开和折叠树视图 | 验证
- javascript - 如何将多个 CommonJS 模块与 Gulp.js 组合在一个 JS 文件中?
- sql-server - 数据集创建问题
- c# - 你如何在c#中访问android权限
- python - 收集所有不同轮廓的非零像素