recyclerview 数据在滚动时发生变化(不重复),动态文本视图在滚动时翻倍
recyclerview data changed on scrolling (Not Duplicate) and dynamic textview got doubled on scrolling
滚动时我的 recyclerview 数据发生了变化 down/up。
当我滚动布局时,它每次都会出现新值
我已经添加了这两种方法,也添加了 false 可回收。但是,没有成功。
这是我的适配器的样子。
public class DetailListAdapter extends RecyclerView.Adapter<DetailListAdapter.ViewHolder> {
Context context;
ArrayList<KcResponse> kcList;
String birthDate; }
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_client_detail, parent, false);
DetailListAdapter.ViewHolder vh = new DetailListAdapter.ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(@NonNull DetailListAdapter.ViewHolder holder, int position) {
holder.setIsRecyclable(false);
holder.periodTv.setText(kcList.get(position).getPeriod());
TextView textView1 = new TextView(context);
textView1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
for (int i = 0; i < arr.length; i++) {
String line = arr[i];
SpannableString ss = new SpannableString(line);
ss.setSpan(new BulletSpan(bulletGap), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.append(ss);
//avoid last "\n"
if (i + 1 < arr.length)
ssb.append("\n");
}
textView1.setTextSize(12);
textView1.setTextColor(ContextCompat.getColor(context, R.color.black_text));
textView1.setPadding(15, 0, 0, 0);
textView1.setText(ssb); // bullet text
holder.effectsLl.addView(textView1);
holder.periodTv.setBackgroundColor(Color.parseColor(kcList.get(position).getColor()));}
@Override
public int getItemCount() {
return kcList.size();
}
您的 recylcerview 中没有超过一种类型的视图,因此可以肯定的是,您不需要覆盖 getItemViewType(int position)
。
另外方法getItemId(int position)
的用法也不正确。该方法用于获取位置处项目的稳定ID。
您共享的适配器代码不足以识别问题。所以我分享了一个非常简单的 recyclerview 及其适配器代码,只是尝试使用它。希望对你有所帮助。
编码愉快...
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private DataAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
adapter = new DataAdapter();
recyclerView.setAdapter(adapter);
recyclerView.addItemDecoration(new DividerItemDecoration(this));
}
}
适配器class代码
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
public DataAdapter() {
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItem = layoutInflater.inflate(R.layout.adapter_layout, parent, false);
ViewHolder viewHolder = new ViewHolder(listItem);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText("TextView1");
holder.textView.setText("TextView2");
}
@Override
public int getItemCount() {
return 20;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView imageView;
public TextView textView;
public ViewHolder(View itemView) {
super(itemView);
this.imageView = itemView.findViewById(R.id.textView1);
this.textView = (TextView) itemView.findViewById(R.id.textView2);
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f1f1f1"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
adapter_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView1" />
</androidx.constraintlayout.widget.ConstraintLayout>
将此覆盖方法添加到您的自定义适配器
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
滚动时我的 recyclerview 数据发生了变化 down/up。 当我滚动布局时,它每次都会出现新值 我已经添加了这两种方法,也添加了 false 可回收。但是,没有成功。
这是我的适配器的样子。
public class DetailListAdapter extends RecyclerView.Adapter<DetailListAdapter.ViewHolder> {
Context context;
ArrayList<KcResponse> kcList;
String birthDate; }
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_client_detail, parent, false);
DetailListAdapter.ViewHolder vh = new DetailListAdapter.ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(@NonNull DetailListAdapter.ViewHolder holder, int position) {
holder.setIsRecyclable(false);
holder.periodTv.setText(kcList.get(position).getPeriod());
TextView textView1 = new TextView(context);
textView1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
for (int i = 0; i < arr.length; i++) {
String line = arr[i];
SpannableString ss = new SpannableString(line);
ss.setSpan(new BulletSpan(bulletGap), 0, line.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.append(ss);
//avoid last "\n"
if (i + 1 < arr.length)
ssb.append("\n");
}
textView1.setTextSize(12);
textView1.setTextColor(ContextCompat.getColor(context, R.color.black_text));
textView1.setPadding(15, 0, 0, 0);
textView1.setText(ssb); // bullet text
holder.effectsLl.addView(textView1);
holder.periodTv.setBackgroundColor(Color.parseColor(kcList.get(position).getColor()));}
@Override
public int getItemCount() {
return kcList.size();
}
您的 recylcerview 中没有超过一种类型的视图,因此可以肯定的是,您不需要覆盖 getItemViewType(int position)
。
另外方法getItemId(int position)
的用法也不正确。该方法用于获取位置处项目的稳定ID。
您共享的适配器代码不足以识别问题。所以我分享了一个非常简单的 recyclerview 及其适配器代码,只是尝试使用它。希望对你有所帮助。
编码愉快...
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private DataAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
adapter = new DataAdapter();
recyclerView.setAdapter(adapter);
recyclerView.addItemDecoration(new DividerItemDecoration(this));
}
}
适配器class代码
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
public DataAdapter() {
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItem = layoutInflater.inflate(R.layout.adapter_layout, parent, false);
ViewHolder viewHolder = new ViewHolder(listItem);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText("TextView1");
holder.textView.setText("TextView2");
}
@Override
public int getItemCount() {
return 20;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView imageView;
public TextView textView;
public ViewHolder(View itemView) {
super(itemView);
this.imageView = itemView.findViewById(R.id.textView1);
this.textView = (TextView) itemView.findViewById(R.id.textView2);
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f1f1f1"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
adapter_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView1" />
</androidx.constraintlayout.widget.ConstraintLayout>
将此覆盖方法添加到您的自定义适配器
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}