Android 如何根据行中存储的项的属性更改特定的ExpandableListView子行背景

Android 如何根据行中存储的项的属性更改特定的ExpandableListView子行背景,android,view,background,adapter,expandablelistview,Android,View,Background,Adapter,Expandablelistview,我有一个可扩展的ListView,其中包含某些对象。这些对象存储一个属性,该属性确定它们所在视图的背景。我的问题是,当android回收视图时,如何确保这些背景始终正确?我遇到的问题是,当我在某一行上更改此背景确定属性,并且该子行上的xml资源发生更改时,为列表创建的下一项使用相同的视图,即使它可能不正确。下面是自定义ExpandableListViewAdapter的代码,它确定ExpandableListView子行视图的xml资源 @Override public View get

我有一个可扩展的ListView,其中包含某些对象。这些对象存储一个属性,该属性确定它们所在视图的背景。我的问题是,当android回收视图时,如何确保这些背景始终正确?我遇到的问题是,当我在某一行上更改此背景确定属性,并且该子行上的xml资源发生更改时,为列表创建的下一项使用相同的视图,即使它可能不正确。下面是自定义ExpandableListViewAdapter的代码,它确定ExpandableListView子行视图的xml资源

@Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        ToDoItem item = mParent.get(groupPosition).getParentChildren().get(childPosition);
        view = convertView;
            if(view == null) {
                // Check item priority and set background accordingly
                if(item.getPriority() == 2) {
                    view = inflater.inflate(R.layout.list_item_medium, null);

                } else if(item.getPriority() == 3) {
                    view = inflater.inflate(R.layout.list_item_high, null);

                } else if(item.getPriority() == 1) {
                    view = inflater.inflate(R.layout.list_item, null);
                }
            }

        TextView tv = null;
        if (view != null) {
            tv = (TextView) view.findViewById(R.id.tasktext);
            tv.setText(item.getTask());
        }
        return view;
    }
如你所见,我正在检查视图是否等于null,以确保我的应用程序以可接受的速度运行。如何在保持背景功能的同时保持优化

我遇到的问题是,当我更改某一行的此背景确定属性并且该行的背景更改时,为列表创建的下一项使用相同的背景,即使它可能不正确

这大概是因为您没有实现
getViewTypeCount()
getItemViewType()
,来教导
AdapterView
用于缓存和回收目的的对象池。如果基于
位置有不同的行结构,则需要正确实现这两种方法


另外,在修改列表行背景时要非常小心,以便在与定点设备(D-pad、轨迹球、箭头键等)一起使用时,不会干扰轻触或选择突出显示栏上的触摸反馈。我建议您除了操纵背景之外,还可以做其他任何事情来区分行


由于您显然使用的是
ExpandableListView
,而不是
ListView
,因此您需要在
BaseExpandableListAdapter
的子类上重写多达四种不同的方法

两个是
getGroupTypeCount()
getChildTypeCount()
。它们分别返回在组级别和子级别使用的不同行类型的数量。我所说的“不同的行类型”,是指“行之间的差异足以使您对回收的担忧发挥作用的情况”。根据您答案中的代码片段,我们可以看到您有三种不同的子行类型,因为您正在根据优先级扩展三种不同的布局。因此,你应该:

@Override
public int getChildTypeCount() {
  return(3);
}
如果在组级别也有不同的行结构,则需要以类似的方式重写
getGroupTypeCount()

然后是
getGroupType()
getChildType()
。它们返回一个值,从
0
getGroupTypeCount()-1
getChildTypeCount()-1
,指示给定的
groupPosition
(或
groupPosition
childPosition
)应该使用哪个回收桶。如果重写
get…TypeCount()
,则还必须重写相应的
get…Type()
方法

因此,我们知道我们需要
getChildType()
。考虑到上面的现有代码,该实现如下所示:

  @Override
  public View getChildView(int groupPosition, int childPosition) {
    ToDoItem item = mParent.get(groupPosition).getParentChildren().get(childPosition);

    return(item.getPriority()-1);
  }
由于您碰巧有
getPriority()
1
运行到
3
,因此我们可以从中减去
1
,以获得所需
0
2
范围内的值。如果行布局基于其他内容(例如,待办事项标题中的第三个字符),则需要在
getChildView()
中使用该逻辑

而且,如果您重写
getGroupTypeCount()
,您还将重写
getGroupType()

我遇到的问题是,当我更改某一行的此背景确定属性并且该行的背景更改时,为列表创建的下一项使用相同的背景,即使它可能不正确

这大概是因为您没有实现
getViewTypeCount()
getItemViewType()
,来教导
AdapterView
用于缓存和回收目的的对象池。如果基于
位置有不同的行结构,则需要正确实现这两种方法


另外,在修改列表行背景时要非常小心,以便在与定点设备(D-pad、轨迹球、箭头键等)一起使用时,不会干扰轻触或选择突出显示栏上的触摸反馈。我建议您除了操纵背景之外,还可以做其他任何事情来区分行


由于您显然使用的是
ExpandableListView
,而不是
ListView
,因此您需要在
BaseExpandableListAdapter
的子类上重写多达四种不同的方法

两个是
getGroupTypeCount()
getChildTypeCount()
。它们分别返回在组级别和子级别使用的不同行类型的数量。我所说的“不同的行类型”,是指“行之间的差异足以使您对回收的担忧发挥作用的情况”。根据您答案中的代码片段,我们可以看到您有三种不同的子行类型,因为您正在根据优先级扩展三种不同的布局。因此,你应该:

@Override
public int getChildTypeCount() {
  return(3);
}
如果在组级别也有不同的行结构,则需要以类似的方式重写
getGroupTypeCount()

然后是
getGroupType()
getChildType()
。它们返回一个值,从
0
getGroupTypeCount()-1
getChildTy