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

Java ListView元素背景-资源可变(),java,android,listview,background,mutated,Java,Android,Listview,Background,Mutated,我的ListView有问题。我想将listView中的每一个元素都设置为背景透明。我使用以下代码: public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if (v == null) { LayoutInflater vi = (LayoutInflate

我的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等。为什么布局会更改?

这是因为列表项的视图被重用,您需要在每次调用getView方法时重置背景,而不仅仅是在convertView为null时。e、 g

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方法时都需要重置后台,而不仅仅是在convertView为null时。e、 g

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。我不知道是否有变异,我建议使用两种不同的可绘制,一种用于透明度,另一种用于其他。但是当我滚动列表时,不会调用getView…在此之前,布局是好的。但是你的解决方案解决了这个问题——我完全不明白为什么。如果在滚动过程中未调用getView方法,并且在滚动之前一切看起来都很好,那么为什么您的答案是解决方案?另外,请告诉我为什么必须使用mutate()两次。@当有新的列表项要显示时,将在滚动过程中调用Marek getView。我不知道变异的原因,我建议使用两种不同的绘图方式,一种用于透明度,另一种用于另一种。