【问题标题】:GetView Vs. BindView in a custom CursorAdapter?GetView 对比自定义 CursorAdapter 中的 BindView?
【发布时间】:2011-04-01 21:28:05
【问题描述】:

所以,我正在观看此视频 http://www.youtube.com/watch?v=N6YdwzAvwOA,Romain Guy 正在展示如何使用 getView() 方法制作更高效的 UI 适配器代码。这也适用于 CursorAdapters 吗?我目前正在为我的自定义光标适配器使用bindView()newView()。我应该改用 getView 吗?

【问题讨论】:

    标签: java android user-interface adapter


    【解决方案1】:

    CursorAdapter 的实现不同于 BaseAdapter 等常规适配器的子类化,您不需要覆盖 getView()getCount()getItemId(),因为可以从游标本身检索这些信息。

    给定一个Cursor,你只需要重写两个方法就可以创建一个CursorAdapter子类:

    bindView():给定一个视图,更新它以在提供的光标中显示数据。

    newView() :调用它来构造一个进入列表的新视图。

    CursorAdapter 将负责回收视图(与常规 Adapter 上的 getView() 方法不同)。它不会在每次需要新行时调用newView()。如果已经有View(不是null),就会直接调用bindView(),这样创建的view就被复用了。通过将每个视图的创建和填充分成这两种方法,CursorAdapter 实现了视图重用,而在常规适配器中,这两件事都在getView() 方法中完成。

    【讨论】:

    • 谢谢,很有帮助。
    【解决方案2】:
    /**
         * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            if (!mDataValid) {
                throw new IllegalStateException("this should only be called when the cursor is valid");
            }
            if (!mCursor.moveToPosition(position)) {
                throw new IllegalStateException("couldn't move cursor to position " + position);
            }
            View v;
            if (convertView == null) {
                v = newView(mContext, mCursor, parent);
            } else {
                v = convertView;
            }
            bindView(v, mContext, mCursor);
            return v;
        }
    

    这个CursorAdapter源代码,显然cursorAdapter工作更多。

    【讨论】:

      【解决方案3】:

      CursorAdapter 有一个getView() 的实现,它委托给newView()bindView(),以强制执行行回收模式的方式。因此,如果您要覆盖 newView()bindView(),则无需对 CursorAdapter 执行任何特殊操作以进行行回收。

      【讨论】:

      • 如何应用 ViewHolder 模式?我会在 newView() 和 bindView() 之间拆分它吗?
      • @Scienceprodigy:在newView() 中,您将为行创建ViewHolder 并将其与setTag() 关联。在bindView() 中,您将通过getTag() 检索ViewHolder
      • @Scienceprodigy:如果您有 2 种以上类型的行,则需要覆盖 getViewTypeCount()getItemViewType()
      • @Christian13467:我真的建议您打开一个新问题,而不是评论一个 18 个月大的答案。话虽如此,如果您说您正在更改职位的视图类型,那么如果不强制完全重新加载AdapterView,这不太可能正常工作。
      • @IgorGanapolsky:ViewHolder 模式,如果您选择使用它,它适用于所有适配器。例如,ArrayAdapter 还回收行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2013-08-19
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多