Android RecyclerView.Adapter onCreateViewHolder()正在运行

时间:2015-06-03 09:00:48

标签: android android-recyclerview

我正在使用RecyclerView.Adapter,但我对它的方法onCreateViewHolder的工作感到困惑。

  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    if(viewType==TYPE_ITEM) {

        View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.inflate_common_item, viewGroup, false);
        ViewHolder vh = new ViewHolder(mView);
        return vh;

    } else {
        View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.inflate_uncommon_item, viewGroup, false);
        ViewHolderFooter vh = new ViewHolderFooter(mView);
        return vh;

    }
}

因此,我的列表中有10个项目,因此对于每个项目,此方法将被调用,每次创建新的ViewHolder时,每次查看一次,但现在我的问题当我们使用ListViewBaseAdapter时,我们将ViewHolder存储在标记中并使用它。我们不会为每件商品创建ViewHolder

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
            MyViewHolder mViewHolder;

            if(convertView == null) {
                    convertView = inflater.inflate(R.layout.layout_list_item, null);
                    mViewHolder = new MyViewHolder();
                    convertView.setTag(mViewHolder);
            } else {
                    mViewHolder = (MyViewHolder) convertView.getTag();
            }

            mViewHolder.tvTitle = detail(convertView, R.id.tvTitle, myList.get(position).getTitle());
            mViewHolder.tvDesc  = detail(convertView, R.id.tvDesc,  myList.get(position).getDescription());
            mViewHolder.ivIcon  = detail(convertView, R.id.ivIcon,  myList.get(position).getImgResId());

            return convertView;
    }

所以我们不创建额外的视图对象。请帮助我理解利弊。

由于

1 个答案:

答案 0 :(得分:19)

onCreateViewHolder仅在RecyclerView可以重复使用的现有视图持有者时才创建新的视图持有者。因此,例如,如果您的RecyclerView一次可以显示5个项目,则会创建5-6 ViewHolders,然后在每次调用onBindViewHolder时自动重复使用它们。

它类似于ListView中的代码所做的(检查convertView是否为null,如果不是,则从标记中抓取现有的ViewHolder),但,RecyclerView,这一切都是自动完成的。

我认为这是使用RecyclerView的专业人士之一 - 您不必像对ViewHolders一样重用ListView。 con是,RecyclerView是非常可定制的,但内置功能很少 - 与ListView不同,它不是很可定制的,但具有很多内置功能。