回收者查看项目奇怪的行为

时间:2017-12-19 16:44:07

标签: android

我使用了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个值。

enter image description here enter image description here

enter image description here

更新 MyAdapterCode

3 个答案:

答案 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
       }
   }