You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于外部类的日期条件修改RecyclerView待办项属性?

解决TodoList列表项根据剩余天数修改背景且不显示天数的问题

你当前通过拼接字符串传递任务信息,导致必须把剩余天数显示出来才能做判断。要解决这个问题,最合理的方式是用数据类封装任务的所有属性,把显示内容和判断逻辑彻底分离。

1. 创建TodoItem数据类

新建一个TodoItem类,封装任务名称、截止日期、剩余天数,让每个属性可以独立使用:

public class TodoItem {
    private String taskName;
    private String dueDate;
    private long remainingDays;

    public TodoItem(String taskName, String dueDate, long remainingDays) {
        this.taskName = taskName;
        this.dueDate = dueDate;
        this.remainingDays = remainingDays;
    }

    // Getter方法
    public String getTaskName() {
        return taskName;
    }

    public String getDueDate() {
        return dueDate;
    }

    public long getRemainingDays() {
        return remainingDays;
    }
}

2. 修改主Activity代码

把原有的ArrayList<String>替换为ArrayList<TodoItem>,调整StartDisplay方法生成TodoItem对象,不再将剩余天数拼入显示字符串:

// 替换原有的private ArrayList<String> items;
private ArrayList<TodoItem> items;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shoppinglist);
    sharedPreferences = getSharedPreferences("ToDoList", Context.MODE_PRIVATE);
    myEdit = sharedPreferences.edit();
    btn = findViewById(R.id.button);
    items = new ArrayList<>();
    StartDisplay();
    recyclerView = findViewById(R.id.list);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new MyRecyclerViewAdapter(this, items);
    adapter.setClickListener(this);
    recyclerView.setAdapter(adapter);
    btn.setOnClickListener(this);
}

// 修改StartDisplay方法
public void StartDisplay() {
    sharedPreferences = getSharedPreferences("ToDoList", Context.MODE_PRIVATE);
    Map<String, ?> allEntries = sharedPreferences.getAll();
    items.clear();
    for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
        String [] item_total = entry.getValue().toString().split(";");
        long remain_days = DateCalc(item_total[0]);
        // 创建TodoItem对象,不拼接剩余天数到显示内容
        items.add(new TodoItem(entry.getKey(), item_total[0], remain_days));
    }
    // 刷新Adapter数据
    if (adapter != null) {
        adapter.notifyDataSetChanged();
    }
}

// 修改onItemClick逻辑,适配TodoItem
@Override
public void onItemClick(View view, int position) {
    sharedPreferences = getSharedPreferences("ToDoList", Context.MODE_PRIVATE);
    TodoItem clickedItem = items.get(position);
    myEdit = sharedPreferences.edit();
    myEdit.remove(clickedItem.getTaskName());
    myEdit.commit();
    adapter.notifyItemRemoved(position);
    items.remove(clickedItem);
}

3. 修改RecyclerView适配器

适配TodoItem类型,在onBindViewHolder中直接用剩余天数判断背景,TextView只显示任务名和截止日期:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private List<TodoItem> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    
    MyRecyclerViewAdapter(Context context, List<TodoItem> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        TodoItem item = mData.get(position);
        // 只显示任务名和截止日期,隐藏剩余天数
        holder.myTextView.setText(item.getTaskName() + " " + item.getDueDate());
        
        // 剩余天数≤0时修改背景,同时恢复默认背景避免View复用异常
        if (item.getRemainingDays() <= 0) {
            holder.myTextView.setBackgroundColor(Color.parseColor("#FF003B"));
        } else {
            holder.myTextView.setBackgroundColor(Color.TRANSPARENT); // 替换为你的默认背景色
        }
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.tvAnimalName);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    TodoItem getItem(int id) {
        return mData.get(id);
    }
    
    void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

关键说明

  • 数据类封装后,可完全分离显示内容与业务逻辑,后续扩展任务属性(如优先级、完成状态)也更方便
  • 必须设置默认背景,否则RecyclerView的View复用机制会导致已处理的列表项背景异常

内容的提问来源于stack exchange,提问作者Ákos Szegleti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:45:18