我有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;
}
我找到修复它的唯一解决方案是重置适配器中的填充和背景:
@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;
}
但它看起来像一个黑客。
有人遇到过同样的问题吗?或者也许知道如何在没有黑客的情况下修复它?
答案 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));
}