首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetBackground of ListView

SetBackground of ListView
EN

Stack Overflow用户
提问于 2015-03-18 16:34:44
回答 3查看 97关注 0票数 0

我必须将特定listView项的背景设置为灰色,条件是isDelivered()和getPicked()都应为真。对于打开活动时出现的前几个listItems,背景设置正确,但一旦我向下滚动,随机项背景设置为灰色,不符合我的条件。

(我觉得这是位置问题),但是我的自定义适配器类扩展了ArrayAdapter,我的logcat上的位置也是正确的0,1,2,3.

代码语言:javascript
复制
@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语句是执行的条件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-18 16:41:35

GetView重用视图。无论其状态为(或颜色),它们可能与xml中的状态不同。

因此,基本上您是将一些项目设置为灰色(条件为真时),并且,当它们被重用时,您不会将它们设置为白色。

我有件事要让你去:

代码语言:javascript
复制
@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;
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-18 16:40:11

这是因为由于性能原因,适配器会回收视图。如果你确保总是设置背景,而不仅仅是当它应该是灰色的时候,你应该是好的。

换句话说,不要相信视图在xml中声明了初始状态,确保显式设置任何项在任何条件下都可以更改的所有颜色和其他属性。

票数 0
EN

Stack Overflow用户

发布于 2015-03-18 16:49:25

您可以尝试一件事:删除:final View rowView = convertView;

而不是返回rowView,而是返回convertView

并替换这个

代码语言:javascript
复制
rowView.setBackgroundResource(R.color.gray);

通过

代码语言:javascript
复制
convertView.setBackgroundResource(R.color.gray);

我也面临着这个问题。我认为进入rowView决赛是造成问题的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29127628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档