ListView项目重复使用填充

时间:2016-03-24 12:14:41

标签: android listview

我有ListView,其中包含具有不同状态的项目。在其中一个状态中,项目TextView具有带填充的自定义背景:

<?xml version="1.0" encoding="UTF-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid 
        android:color="@color/..." />
    <padding
        android:left="8dp"
        android:right="8dp" />
    <corners 
        android:radius="10dp" />
</shape>

对于所有其他州,背景为null

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final View result = convertView != null
                ? convertView
                : getLayoutInflater().inflate(R.layout.item, parent, false);
        final View statusView = result.findViewById(R.id.status);
        if (position % 4 == 0) {
            statusView.setBackgroundResource(R.drawable.target);
        } else {
            statusView.setBackground(null);
        }
        return result;
    }

当我滚动此列表时,一些没有背景的项目在重用后会有填充。screenshot

我找到修复它的唯一解决方案是重置适配器中的填充和背景:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final View result = convertView != null
                ? convertView
                : getLayoutInflater().inflate(R.layout.item, parent, false);
        final View statusView = result.findViewById(R.id.status);
        statusView.setPadding(0, 0, 0, 0);
        if (position % 4 == 0) {
            statusView.setBackground(null);
            statusView.setBackgroundResource(R.drawable.target);
        } else {
            statusView.setBackground(null);
        }
        return result;
    }

但它看起来像一个黑客。
有人遇到过同样的问题吗?或者也许知道如何在没有黑客的情况下修复它?

2 个答案:

答案 0 :(得分:3)

根据View.setBackground(),它似乎不是黑客,你需要明确重置填充。

  

将背景设置为给定的Drawable,或删除背景。如果   后台有填充,这个View的填充设置为   背景填充。但是,删除背景时,这个   视图的填充未被触及。如果需要设置填充,   请使用setPadding(int,int,int,int)

如果我理解正确的代码,即使设置没有填充的新背景也不会改变当前视图的填充

答案 1 :(得分:0)

如果使用两种或更多种类的行,则必须复制所有自定义元素,并为每一行设置它。所以基本上每行需要2个,drawable,text,PADDING等。或者适配器会回收一些项目,有时候不会。

示例,这里我更改了每一行的图标

    if (sqLite.imageReport(list.get(arg0).getId(), id_shop) == null) {
        holder.imageView.setImageDrawable(ContextCompat.getDrawable(context,
                R.drawable.ic_add_circle_green_36dp));
    } else {
        holder.imageView.setImageDrawable(ContextCompat.getDrawable(context,
                R.drawable.ic_check_circle_blue_36dp));
    }