在Android开发中,滚动时高亮显示的项目在重新查看时丢失的问题通常与RecyclerView的视图回收机制有关。RecyclerView通过重用已经滑出屏幕的视图来提高性能,这就可能导致一些状态(如高亮显示)在视图被回收和重用时丢失。
问题:滚动时高亮显示的项目在重新查看时丢失。 原因:当RecyclerView滚动时,已经滑出屏幕的视图会被回收并重用给新的列表项。如果没有正确地保存和恢复每个列表项的状态,那么之前的高亮显示状态就会丢失。
为了保持高亮状态,需要在Adapter中保存每个列表项的状态,并在视图被重用时恢复这些状态。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Item> items;
private SparseBooleanArray selectedItems;
public MyAdapter(List<Item> items) {
this.items = items;
this.selectedItems = new SparseBooleanArray();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Item item = items.get(position);
holder.textView.setText(item.getText());
// 恢复高亮状态
holder.itemView.setSelected(selectedItems.get(position, false));
}
@Override
public int getItemCount() {
return items.size();
}
public void toggleSelection(int position) {
if (selectedItems.get(position, false)) {
selectedItems.delete(position);
} else {
selectedItems.put(position, true);
}
notifyItemChanged(position);
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
ViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
itemView.setOnClickListener(v -> {
// 切换高亮状态
int adapterPosition = getAdapterPosition();
if (adapterPosition != RecyclerView.NO_POSITION) {
((MyAdapter) itemView.getTag()).toggleSelection(adapterPosition);
}
});
}
}
}
在这个示例中,我们使用SparseBooleanArray
来保存每个列表项的高亮状态。当列表项被点击时,我们切换其高亮状态,并通过notifyItemChanged
通知RecyclerView更新视图。在onBindViewHolder
方法中,我们根据保存的状态来设置视图的高亮显示。
通过这种方式,即使视图被回收和重用,高亮状态也能够得到正确的恢复。
领取专属 10元无门槛券
手把手带您无忧上云