我使用了recycler
视图来显示我的歌曲列表。
因此,每首歌都以cardview
的形式出现,其中包含两个textviews
。
现在一切都很完美,直到我尝试将boldface
设置为所选项目。
View view= mLayoutManager.findViewByPosition(currID);
mRecyclerView.scrollToPosition(currID);// This works fine.
final TextView textView=view.findViewById(R.id.song_name);
textView.setTypeface(null,Typeface.BOLD);
现在这确实有效,但我能看到的是,即使我指定了该项目的ID,每12个项目都有这个字体。
就像假设一样,如果我将这段代码Log.e("Value",textView.getText().toString());
添加到上面的行中,它会给我相应的项目textview值。
为什么boldface
被设置为recyclerview内的每第12个值。
答案 0 :(得分:1)
您需要让适配器处理该设置,而不是直接进入回收站视图。
您的数据结构应该具有您选择的属性,然后调用适配器notifyItemChanged()
你的适配器应该有像
这样的东西onBindViewHolder(ViewHolder holder..) {
if (song.isSelected()) {
// set bold
} else {
// set regular
}
}
在你的Song类中,如果该歌曲应该是粗体,你需要添加一个布尔属性。
使用ID或位置拨打适配器,更新歌曲,然后拨打notifyDataSetChanged()
或notifyItemChanged()
修改强>
您需要从Activity / Fragment中删除设置粗体样式的代码并将其放入onBindViewHolder
您选择的属性需要是歌曲对象的一部分,而不是ViewHolder。
在您获得广播的地方,您需要更新适配器内列表中的Song对象并调用其中一种notifyXxx方法。
答案 1 :(得分:0)
因为它是recyclelerview并且每次都没有创建新项目但重复使用滚动。因此,您需要默认设置普通字体
textView.setTypeface(null,selected ? Typeface.BOLD : Typeface.NORMAL);
答案 2 :(得分:0)
尝试在每个新项目的位置之前设置普通的typeFace,这样可以防止第12个项目出现不需要的字体。
onBindViewHolder(ViewHolder holder..) {
//set normal before every new item's position
textView.setTypeface(null,Typeface.NORMAL);
if (song.isSelected()) {
// set bold
} else {
// set normal
}
}