如何基于外部类的日期条件修改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
相关产品推荐
相关产品推荐

