Recyclerview适配器无法正常工作

问题描述 投票:0回答:2

在我的适配器中,我正在检查值是否大于或等于零,我将布局颜色更改为绿色,如果不是,它将保持红色。问题是,当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();
    }

}
java android android-recyclerview adapter
2个回答
0
投票

您应添加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())));
  }

0
投票

可能是因为作为回收视图,回收了视图持有者,并且您的代码仅在一个方向上改变了颜色,即变为绿色

尝试


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())));
}

© www.soinside.com 2019 - 2024. All rights reserved.