我必须将特定listView项的背景设置为灰色,条件是isDelivered()和getPicked()都应为真。对于打开活动时出现的前几个listItems,背景设置正确,但一旦我向下滚动,随机项背景设置为灰色,不符合我的条件。
(我觉得这是位置问题),但是我的自定义适配器类扩展了ArrayAdapter,我的logcat上的位置也是正确的0,1,2,3.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.custaddress, parent, false);
}
final View rowView = convertView;
tripPickUp = (Button) rowView.findViewById(R.id.picked);
tripDelivered = (Button) rowView.findViewById(R.id.delivered);
tripIsDelivered = (TextView) rowView.findViewById(R.id.isdelivered);
if (tripsheet[position].getPicked() == false
&& tripsheet[position].isDelivered() == false) {
tripPickUp.setVisibility(View.VISIBLE);
tripDelivered.setVisibility(View.INVISIBLE);
tripIsDelivered.setVisibility(View.INVISIBLE);
}
else if (tripsheet[position].isDelivered() == false
&& tripsheet[position].getPicked() == true) {
tripPickUp.setVisibility(View.INVISIBLE);
tripDelivered.setVisibility(View.VISIBLE);
tripIsDelivered.setVisibility(View.INVISIBLE);
} else {
tripDelivered.setVisibility(View.INVISIBLE);
tripIsDelivered.setVisibility(View.VISIBLE);
tripPickUp.setVisibility(View.INVISIBLE);
rowView.setBackgroundResource(R.color.gray);
}
return rowView;
}基本上,that语句是执行的条件。
发布于 2015-03-18 16:41:35
GetView重用视图。无论其状态为(或颜色),它们可能与xml中的状态不同。
因此,基本上您是将一些项目设置为灰色(条件为真时),并且,当它们被重用时,您不会将它们设置为白色。
我有件事要让你去:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.custaddress, parent, false);
}
final View rowView = convertView;
tripPickUp = (Button) rowView.findViewById(R.id.picked);
tripDelivered = (Button) rowView.findViewById(R.id.delivered);
tripIsDelivered = (TextView) rowView.findViewById(R.id.isdelivered);
if (tripsheet[position].getPicked() == false
&& tripsheet[position].isDelivered() == false) {
tripPickUp.setVisibility(View.VISIBLE);
tripDelivered.setVisibility(View.INVISIBLE);
tripIsDelivered.setVisibility(View.INVISIBLE);
rowView.setBackgroundResource(Color.WHITE);
}
else if (tripsheet[position].isDelivered() == false
&& tripsheet[position].getPicked() == true) {
tripPickUp.setVisibility(View.INVISIBLE);
tripDelivered.setVisibility(View.VISIBLE);
tripIsDelivered.setVisibility(View.INVISIBLE);
rowView.setBackgroundResource(Color.WHITE);
} else {
tripDelivered.setVisibility(View.INVISIBLE);
tripIsDelivered.setVisibility(View.VISIBLE);
tripPickUp.setVisibility(View.INVISIBLE);
rowView.setBackgroundResource(R.color.gray);
}
return rowView;
}发布于 2015-03-18 16:40:11
这是因为由于性能原因,适配器会回收视图。如果你确保总是设置背景,而不仅仅是当它应该是灰色的时候,你应该是好的。
换句话说,不要相信视图在xml中声明了初始状态,确保显式设置任何项在任何条件下都可以更改的所有颜色和其他属性。
发布于 2015-03-18 16:49:25
您可以尝试一件事:删除:final View rowView = convertView;
而不是返回rowView,而是返回convertView
并替换这个
rowView.setBackgroundResource(R.color.gray);通过
convertView.setBackgroundResource(R.color.gray);我也面临着这个问题。我认为进入rowView决赛是造成问题的原因。
https://stackoverflow.com/questions/29127628
复制相似问题