Android实现打开其他Activity后在ListView对应项显示勾选图标
Android实现子页面返回后ListView对应项显示勾选标记方案
实现逻辑分4步走,原生API即可完成,无需额外依赖:
- 第一步:改造列表数据模型
给每个列表对应的数据项新增布尔类型的状态标记字段isVisited,默认值为false,用来记录对应页面是否已经完成访问,示例实体类结构:
public class PageEntry { // 列表显示的页面名称 public String pageName; // 点击后跳转的目标Activity public Class<?> targetClz; // 访问状态标记:true=已完成访问显示勾选,false=未访问隐藏勾选 public boolean isVisited; }
- 第二步:调整列表适配器逻辑
自定义继承自BaseAdapter的列表适配器,在getView方法中根据当前项的isVisited字段值,控制勾选图标的显示/隐藏,注意做好ViewHolder复用避免列表滚动时状态错乱,核心逻辑参考:
@Override public View getView(int position, View convertView, ViewGroup parent) { ItemHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_page_entry, parent, false); holder = new ItemHolder(); holder.nameTv = convertView.findViewById(R.id.tv_page_name); holder.tickIv = convertView.findViewById(R.id.iv_tick); convertView.setTag(holder); } else { holder = (ItemHolder) convertView.getTag(); } PageEntry currentItem = getItem(position); holder.nameTv.setText(currentItem.pageName); // 核心状态控制逻辑 holder.tickIv.setVisibility(currentItem.isVisited ? View.VISIBLE : View.GONE); return convertView; }
- 第三步:带参数启动子页面
在Activity A的列表项点击事件中,不要直接用普通跳转方式,选择带结果回调的启动方式,同时把当前点击的列表项位置通过Intent传给目标页面:
// 列表点击事件 listView.setOnItemClickListener((parent, view, position, id) -> { PageEntry entry = dataList.get(position); Intent jumpIntent = new Intent(ActivityA.this, entry.targetClz); // 传入点击的列表位置,返回时用于定位要更新的项 jumpIntent.putExtra("item_position", position); pageJumpLauncher.launch(jumpIntent); });
- 第四步:处理子页面返回回调
首先在Activity B、C中,当用户完成访问操作准备返回A时,先设置成功结果码再关闭页面:
// Activity B/C中用户完成操作的触发逻辑(比如表单提交、确认按钮点击事件) setResult(RESULT_OK); finish();
然后在Activity A中注册页面返回回调,拿到返回结果后更新对应位置列表项的访问状态,刷新适配器即可:
// 注册Activity结果回调 ActivityResultLauncher<Intent> pageJumpLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { int updatePos = result.getData().getIntExtra("item_position", -1); if (updatePos >= 0) { // 更新对应项的访问状态 dataList.get(updatePos).isVisited = true; // 通知列表刷新 adapter.notifyDataSetChanged(); } } } );
补充说明:如果需要APP重启后依然保留勾选状态,只需要在更新
isVisited字段时,把状态同步存入SharedPreferences或本地数据库,每次进入Activity A加载列表数据时,优先读取本地存储的状态给字段赋值即可。
内容的提问来源于stack exchange,提问作者Riio Nazario
相关产品推荐
相关产品推荐

