隐藏ListView某一行后,按位置设置行颜色出现重复问题
解决ListView隐藏项后交替颜色异常的问题
嘿,我完全懂你遇到的麻烦!你隐藏了重复的"Old High Court Interchange"项后,用原列表的position来计算交替颜色,结果出现两行同色的情况——这核心问题在于你用的是原数据列表的position,而非界面上实际显示项的位置。
问题根源
当你隐藏某一行后,原列表的position并没有改变,但界面上显示的项的实际顺序已经和原position脱节了。举个例子:假设原position=2的项被隐藏,那原position=3的项在界面上是第2个显示项,但你还是用3来取模,前一个显示项是position=1(取模结果1),position=3取模结果也是1,自然就会出现两行同色的情况。
解决方案
我们需要计算界面上实际显示的项的位置,而不是原列表的position。因为你只隐藏第一个出现的"Old High Court Interchange",可以简化处理:记录被隐藏项的位置,然后根据当前position调整得到实际显示位置,再用这个位置计算颜色。
修改后的完整代码如下:
// 在适配器类中添加成员变量 private int hiddenPosition = -1; // 记录被隐藏项的位置 private boolean flag = true; private int[] colors = new int[] { 0x30FFFFFF, 0x30A9A9A9 }; // 交替颜色 @Override public View getView(int position, View convertView, ViewGroup parent) { // 初始化ViewHolder(保持你原有的逻辑) ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.your_item_layout, parent, false); holder = new ViewHolder(); holder.mainll = convertView.findViewById(R.id.mainll); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 处理项的显示/隐藏逻辑 String stationName = stationlist.get(position).getStation_name(); if (stationName.equals("Old High Court Interchange")) { if (flag) { holder.mainll.setVisibility(View.GONE); hiddenPosition = position; // 记录被隐藏的位置 flag = false; } else { holder.mainll.setVisibility(View.VISIBLE); } } else { holder.mainll.setVisibility(View.VISIBLE); } // 计算实际显示的位置,用于颜色交替 int actualDisplayPos; if (hiddenPosition != -1) { if (position == hiddenPosition) { // 隐藏的项不需要设置颜色,直接返回 holder.mainll.setBackgroundColor(Color.TRANSPARENT); return convertView; } else if (position > hiddenPosition) { // 当前项在隐藏项之后,实际显示位置要减1 actualDisplayPos = position - 1; } else { actualDisplayPos = position; } } else { actualDisplayPos = position; } // 设置交替颜色 int colorIndex = actualDisplayPos % colors.length; holder.mainll.setBackgroundColor(colors[colorIndex]); return convertView; } // 你的ViewHolder类(保持原有逻辑) static class ViewHolder { LinearLayout mainll; }
为什么这样能解决问题?
我们通过hiddenPosition记录了被隐藏项的位置,然后对每个要显示的项,计算它在界面上的实际位置:
- 如果当前项在隐藏项之前,实际位置等于原position
- 如果当前项在隐藏项之后,实际位置是原position减1(跳过了隐藏的那一行)
- 隐藏项本身直接跳过颜色设置
这样用实际显示位置来取模计算颜色,就能保证界面上的项颜色交替完全正常啦!
内容的提问来源于stack exchange,提问作者Dharmesh Patel
相关产品推荐
相关产品推荐

