0

我有一个包含某些对象的 ExpandableListView。这些对象存储了一个属性,该属性确定了它们所在视图的背景。我的问题是,当 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 以确保我的应用程序以可接受的速度运行。如何在保持背景功能的同时保持优化?

4

1 回答 1

3

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

据推测,那是因为您还没有实现getViewTypeCount(),getItemViewType()来教导使用AdapterView什么对象池来进行缓存和回收。如果您将基于 具有不同的行结构position,则需要正确实现这两种方法。

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


由于您显然正在使用ExpandableListView,而不是ListView,因此您需要在BaseExpandableListAdapter.

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

@Override
public int getChildTypeCount() {
  return(3);
}

如果您在组级别也有不同的行结构,则需要以getGroupTypeCount()类似的方式覆盖。

然后,有getGroupType()getChildType()。它们返回一个值 from0getGroupTypeCount()-1getChildTypeCount()-1,指示应该将哪个回收桶用于给定groupPosition(或groupPositionchildPositionfor getChildType())。如果你覆盖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);
  }

由于您碰巧从togetPriority()运行,我们可以从中减去以获得我们想要的范围内的值。如果您将行布局基于其他内容(例如,待办事项标题中的第三个字符),则需要使用该逻辑。13102getChildView()

而且,如果你覆盖getGroupTypeCount(),你也会覆盖getGroupType()

于 2013-06-07T14:46:21.010 回答