Recyclerview 适配器无法正常工作
Recyclerview Adapter not working properly
在我的适配器中,我正在检查值是否大于或等于零,我将布局颜色更改为绿色,如果不是,则保持红色。
问题是当 recyclerview 中有很多项目颜色停止变化时,或者它们都显示为绿色(即使值小于零)。
是什么导致了问题,我该如何解决?
提前致谢。
这是我的适配器:
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import java.text.DecimalFormat;
import java.util.ArrayList;
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.RVViewHolder> {
private Context mContext;
private ArrayList<Item> itemList;
public RVAdapter(Context context, ArrayList<Item> arrayList) {
mContext = context;
itemList = arrayList;
}
public static class RVViewHolder extends RecyclerView.ViewHolder {
TextView valueTv, memoTv, categoryTv, dateTv;
LinearLayout indicatorLL, infoLL;
CardView itemLL;
public RVViewHolder(View itemView) {
super(itemView);
// Calling FindViewByID()
valueTv = itemView.findViewById(R.id.tv_value);
memoTv = itemView.findViewById(R.id.tv_memo);
categoryTv = itemView.findViewById(R.id.tv_category);
dateTv = itemView.findViewById(R.id.tv_date);
indicatorLL = itemView.findViewById(R.id.layout_indicator);
infoLL = itemView.findViewById(R.id.layout_item_info);
itemLL = itemView.findViewById(R.id.item_layout);
}
}
@Override
public RVViewHolder onCreateViewHolder(ViewGroup parent, int i) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.item_layout, parent, false);
return new RVViewHolder(view);
}
@Override
public void onBindViewHolder(RVViewHolder holder, int position) {
//holder.infoLL.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_transition_anim));
//holder.indicatorLL.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_transition_anim));
Item item = itemList.get(position);
DecimalFormat format = new DecimalFormat("#,###,###,###.##");
Double value = item.getValue();
holder.valueTv.setText(format.format(value));
if (value > 0 || value == 0) {
Resources res = mContext.getResources();
//holder.indicatorLL.setBackground(res.getDrawable(R.drawable.item_income_indicator_bg, mContext.getTheme()));
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.green, mContext.getTheme())));
}
holder.memoTv.setText(item.getMemo().toString());
holder.categoryTv.setText(item.getCategory().toString());
holder.dateTv.setText(item.getDate().toString());
holder.itemLL.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_transition_anim));
}
@Override
public int getItemCount() {
return itemList.size();
}
}
您应该添加 else statement
,因为滚动时会回收视图
if (value > 0 || value == 0) {
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.green, mContext.getTheme())));
} else {
// Set default color
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.red, mContext.getTheme())));
}
可能是因为作为 recyclerview,viewholder 会被回收,而您的代码只会在一个方向上改变颜色,即变为绿色
尝试
Resources res = mContext.getResources();
if (value > 0 || value == 0) {
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.green, mContext.getTheme())));
} else {
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.red, mContext.getTheme())));
}
在我的适配器中,我正在检查值是否大于或等于零,我将布局颜色更改为绿色,如果不是,则保持红色。 问题是当 recyclerview 中有很多项目颜色停止变化时,或者它们都显示为绿色(即使值小于零)。 是什么导致了问题,我该如何解决? 提前致谢。 这是我的适配器:
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import java.text.DecimalFormat;
import java.util.ArrayList;
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.RVViewHolder> {
private Context mContext;
private ArrayList<Item> itemList;
public RVAdapter(Context context, ArrayList<Item> arrayList) {
mContext = context;
itemList = arrayList;
}
public static class RVViewHolder extends RecyclerView.ViewHolder {
TextView valueTv, memoTv, categoryTv, dateTv;
LinearLayout indicatorLL, infoLL;
CardView itemLL;
public RVViewHolder(View itemView) {
super(itemView);
// Calling FindViewByID()
valueTv = itemView.findViewById(R.id.tv_value);
memoTv = itemView.findViewById(R.id.tv_memo);
categoryTv = itemView.findViewById(R.id.tv_category);
dateTv = itemView.findViewById(R.id.tv_date);
indicatorLL = itemView.findViewById(R.id.layout_indicator);
infoLL = itemView.findViewById(R.id.layout_item_info);
itemLL = itemView.findViewById(R.id.item_layout);
}
}
@Override
public RVViewHolder onCreateViewHolder(ViewGroup parent, int i) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.item_layout, parent, false);
return new RVViewHolder(view);
}
@Override
public void onBindViewHolder(RVViewHolder holder, int position) {
//holder.infoLL.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_transition_anim));
//holder.indicatorLL.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_transition_anim));
Item item = itemList.get(position);
DecimalFormat format = new DecimalFormat("#,###,###,###.##");
Double value = item.getValue();
holder.valueTv.setText(format.format(value));
if (value > 0 || value == 0) {
Resources res = mContext.getResources();
//holder.indicatorLL.setBackground(res.getDrawable(R.drawable.item_income_indicator_bg, mContext.getTheme()));
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.green, mContext.getTheme())));
}
holder.memoTv.setText(item.getMemo().toString());
holder.categoryTv.setText(item.getCategory().toString());
holder.dateTv.setText(item.getDate().toString());
holder.itemLL.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_transition_anim));
}
@Override
public int getItemCount() {
return itemList.size();
}
}
您应该添加 else statement
,因为滚动时会回收视图
if (value > 0 || value == 0) {
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.green, mContext.getTheme())));
} else {
// Set default color
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.red, mContext.getTheme())));
}
可能是因为作为 recyclerview,viewholder 会被回收,而您的代码只会在一个方向上改变颜色,即变为绿色
尝试
Resources res = mContext.getResources();
if (value > 0 || value == 0) {
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.green, mContext.getTheme())));
} else {
holder.indicatorLL.setBackgroundTintList(ColorStateList.valueOf(res.getColor(R.color.red, mContext.getTheme())));
}