【问题标题】:CursorAdapter bindView() does not correctly map to the view returned from newView()CursorAdapter bindView() 没有正确映射到从 newView() 返回的视图
【发布时间】:2013-04-26 04:15:23
【问题描述】:

我有一个 CursorAdapter 重写了 newView() 和 bindView()。问题是 bindView() 没有正确映射到 newView() 创建的视图。

newView() 根据光标值返回从不同布局膨胀的两个不同视图,如下所示。

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent){
    View view = null;
    int who = //... get a value from cursor

    switch(who){
    case 0:
        view = LayoutInflater.from(context).inflate(R.layout.first, null);
        view.setTag("case 0"); // for bindView() mapping inspection
        break;
    case 1:
        view = LayoutInflater.from(context).inflater(R.layout.second, null);
        view.setTag("case 1"); // for bindView() mapping inspection
        break;
    default:
        break;
    }
    return view;
}

然后,bindView() 就像往常一样。从光标获取值并将值设置为从 newView() 返回的视图中的 UI 元素。没什么特别的。我在 bindView() 中放置了一个日志,显示了在 newView() 中设置的视图标签。日志显示 bindView() 在调用时没有获得所需的视图。

我认为当调用 bindView() 时,它会绑定到现有视图(如果有的话)以提高内存效率。所以我认为 bindView 获得了一个特定的视图,可能由行 _ID 标识。但似乎当它被调用时,它只会获得任何现有的视图。

当视图可以有不同的布局时,如何让 bindView 获取具有特定布局的指定视图?

【问题讨论】:

    标签: android android-cursoradapter


    【解决方案1】:

    默认情况下,ListView 中的所有项目都被视为相同的视图类型。您可以覆盖 getItemViewType 以根据位置返回不同的值。然后视图将仅用于相同的项目视图类型。

    您还需要覆盖getViewTypeCount,否则getItemViewType 将不起作用。

    【讨论】:

    • 感谢您的建议。我认为这是解决问题的方法。我有另一个问题。何时调用与 newView 相关的 getItemViewType?
    • @seongjoo - 在任何视图膨胀之前调用getItemViewType。流程为getItemViewType(判断是否将非空convertView传递给getView)->getView->(如果convertView==nullnewView)->bindView
    • override getViewTypeCount 解决了我花了 2 小时解决的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2012-08-26
    相关资源
    最近更新 更多