嵌套布局时,recyclerview onBind 无法正常工作
recyclerview onBind not working properly when Layouts are nested
我试图实现一个简单的 RecyclerView 示例,其中的项目可以交替着色https://i.stack.imgur.com/BFmJi.jpg,效果很好
如果没有 Framelayout,我们将获得清晰的着色代码,如第一张图片所示
即物品以特定图案着色
然而
添加 FrameLayout 部分后,我遇到颜色代码未正确显示的问题 https://i.stack.imgur.com/phKNT.jpg
从技术上讲,添加 FrameLayout 部分后发生了什么变化
这是 RecyclerView class onBindView 代码:
@Override
public void onBindViewHolder(DataAdapter.ViewHolder holder, int position) {
if(values.contains(position+1)){
holder.textView1.setBackgroundColor(ContextCompat.getColor(context,R.color.colorAccent));
System.out.println("Color Check : "+values + " "+position);
}
String value = MyData[position];
holder.textView1.setText(value);
}
这是 RecyclerView xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:layout_width="match_parent"
android:elevation="16dp"
android:layout_margin="16dp"
android:id="@+id/frame1"
android:background="#fff"
android:layout_height="200dp">
<TextView
android:layout_width="match_parent"
android:id="@+id/textView1"
android:text="Sample Items"
android:layout_height="wrap_content"
/>
</FrameLayout>
</LinearLayout>
编辑 1:
我需要的逻辑是项目 1、3、6、10、15 应该是彩色的(FrameLayout 或 textView)
在 RecyclerView post 的 xml 布局中引入 FrameLayout 之前,逻辑工作正常,
变色的项目是 1,3,6,8,10,13,15
我不明白你的逻辑,但如果它在你使用 RecyclerView 作为简单列表而不是 "cards" 时工作,可能是因为当你使用大量尺寸时 onBindViewHolder 只是打印所有内容而没有回收在您的列表中,recyclerview 将尝试重复使用内容。
你可以试试这个:
holder.setIsRecyclable(false);
对我有用的另一件事是需要为 if 设置条件,然后为剩余选项设置 else 条件
我认为它比 holder.setIsRecyclable(false) 更好的解决方案;
@Override
public void onBindViewHolder(DataAdapter.ViewHolder holder, int position) {
//holder.setIsRecyclable(false);
if(values.contains(position+1)){
holder.textView1.setBackgroundColor(ContextCompat.getColor(context,R.color.colorAccent));
}else
{
holder.textView1.setBackgroundColor(ContextCompat.getColor(context,R.color.white));
}
String value = MyData[position];
holder.textView1.setText(value);
}
我试图实现一个简单的 RecyclerView 示例,其中的项目可以交替着色https://i.stack.imgur.com/BFmJi.jpg,效果很好
如果没有 Framelayout,我们将获得清晰的着色代码,如第一张图片所示
即物品以特定图案着色
然而
添加 FrameLayout 部分后,我遇到颜色代码未正确显示的问题 https://i.stack.imgur.com/phKNT.jpg
从技术上讲,添加 FrameLayout 部分后发生了什么变化
这是 RecyclerView class onBindView 代码:
@Override
public void onBindViewHolder(DataAdapter.ViewHolder holder, int position) {
if(values.contains(position+1)){
holder.textView1.setBackgroundColor(ContextCompat.getColor(context,R.color.colorAccent));
System.out.println("Color Check : "+values + " "+position);
}
String value = MyData[position];
holder.textView1.setText(value);
}
这是 RecyclerView xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:layout_width="match_parent"
android:elevation="16dp"
android:layout_margin="16dp"
android:id="@+id/frame1"
android:background="#fff"
android:layout_height="200dp">
<TextView
android:layout_width="match_parent"
android:id="@+id/textView1"
android:text="Sample Items"
android:layout_height="wrap_content"
/>
</FrameLayout>
</LinearLayout>
编辑 1:
我需要的逻辑是项目 1、3、6、10、15 应该是彩色的(FrameLayout 或 textView)
在 RecyclerView post 的 xml 布局中引入 FrameLayout 之前,逻辑工作正常,
变色的项目是 1,3,6,8,10,13,15
我不明白你的逻辑,但如果它在你使用 RecyclerView 作为简单列表而不是 "cards" 时工作,可能是因为当你使用大量尺寸时 onBindViewHolder 只是打印所有内容而没有回收在您的列表中,recyclerview 将尝试重复使用内容。
你可以试试这个:
holder.setIsRecyclable(false);
对我有用的另一件事是需要为 if 设置条件,然后为剩余选项设置 else 条件 我认为它比 holder.setIsRecyclable(false) 更好的解决方案;
@Override
public void onBindViewHolder(DataAdapter.ViewHolder holder, int position) {
//holder.setIsRecyclable(false);
if(values.contains(position+1)){
holder.textView1.setBackgroundColor(ContextCompat.getColor(context,R.color.colorAccent));
}else
{
holder.textView1.setBackgroundColor(ContextCompat.getColor(context,R.color.white));
}
String value = MyData[position];
holder.textView1.setText(value);
}