2016-03-24 21 views
1

私は異なる状態のアイテムを含む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; 
    } 

が、それはハックのように見えます。
誰も同じ問題に直面しましたか?または、ハックなしで修正する方法を知っているかもしれませんか?

答えて

3

これはハックではないようですが、View.setBackground()によれば、パディングを明示的にリセットする必要があります。

背景を指定したDrawableに設定するか、背景を削除します。 背景にパディングがある場合、このビューのパディングは の背景のパディングに設定されます。ただし、背景を削除すると、 ビューのパディングには触れません。パディングを設定することが望ましい場合は、

(int型、int型、int型、int型)setPaddingを使用してください、私はコードを正しく理解していれば、でも、パディングせずに新しい背景を設定すると、現在のビューのパディングを変更しません

0

2つ以上のタイプの行を使用する場合は、すべてのカスタム要素を複製し、すべての行に設定する必要があります。だから基本的には、すべての行、drawables、テキスト、PADDINGなど2またはアダプタがいくつかのアイテムをリサイクルし、時にはない必要があります。

例は、ここで私は、すべての行の上にアイコンを変更

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)); 
    }