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

隐藏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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:01:05