ListView 元素背景 - 资源可变()

Posted

技术标签:

【中文标题】ListView 元素背景 - 资源可变()【英文标题】:ListView element background - resource mutable() 【发布时间】:2013-06-03 04:54:36 【问题描述】:

我的 ListView 有问题。我想将 listView 中的每个第二个元素设置为使其背景透明。我使用以下代码:

public View getView(int position, View convertView, ViewGroup parent) 
        View v = convertView;
        ViewHolder holder;
        if (v == null) 
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_row_object, null);

            Drawable backgroundDrawable = context.getResources().getDrawable(R.drawable.abstract_gray);
            if((int)(position%2)==1)
                backgroundDrawable.mutate().setAlpha(ToolsAndConstants.BACKGROUND_TRANSPARENCY);

            // It is not working sometimes when I just use v.setBackground(backgroundDrawable); here. Why?
            v.setBackground(backgroundDrawable.mutate());

            holder = new ViewHolder();
            holder.rowNumber = (TextView) v.findViewById(R.id.list_row2_number);
            holder.character = (TextView) v.findViewById(R.id.list_row2_char);
            holder.strokesNumber = (TextView) v.findViewById(R.id.list_row2_strokes_number);
            v.setTag(holder);
        
        else
            holder = (ViewHolder)v.getTag();

        (...)
        (...)
        (...)
        return v;
    

列表加载正常,但问题是当我上下滚动它几次时,它变得非常疯狂(?随机?设置透明背景和纯色背景)。请参考以下截图(滚动前后):

之前:

之后:

在适配器类之外,我只添加了 onClickListener,在其中我将片段替换为不同的片段。没有onScrollListener等,为什么布局会发生变化?

【问题讨论】:

【参考方案1】:

这是因为列表项的视图是复用的,所以每次调用getView方法时都需要重置后台,不仅convertView为null。例如

public View getView(int position, View convertView, ViewGroup parent)
     ....
     if (v == null) 
         // Inflate the view without set the background
     

     // Set the background based on position
     ...

【讨论】:

但是当我滚动列表时,getView 没有被调用......在那个布局之前是好的。但是您的解决方案解决了问题-我完全不明白为什么。如果在滚动期间没有调用 getView 方法,并且在滚动之前一切看起来都很好,为什么您的答案是一个解决方案? 另外请告诉我为什么我必须使用 mutate() 两次。 @Marek getView 将在滚动期间在有新列表项要显示时调用。我不知道变异,我建议使用两种不同的drawable,一种用于透明度,一种用于另一种。

以上是关于ListView 元素背景 - 资源可变()的主要内容,如果未能解决你的问题,请参考以下文章

您试图在一个本应是不可变且已被冻结的对象上设置密钥

ListView的用法

手机卫士05_背景资源_listview优化_进程查看

从 ListView 更改特定元素

滚动时背景ListView变黑

Android:ListView 中的多个同时倒计时计时器