在recyclerview OnBindViewHolder方法中为每一行创建POJO对象

时间:2016-02-22 18:51:01

标签: android performance android-recyclerview

这是我的onBindViewHolder方法,它为recyclerView中的每一行运行。我一次有大约500到600行。我在做什么

1 - 初始化我的Parcelable POJO类对象
2 - 将此对象作为Intent参数传递,以便在onItemClick事件发生时启动另一个活动。

AFAIK Java并不支持真正的闭包,因此,如果你想在内部类中使用它,它会强制我们创建一个对象/变量final。 Java通过在隐藏变量中存储常量值来模仿闭包行为,并在以后需要时引用它们。

我想知道的,

性能/内存方面是否可以为onBinderViewHolder方法中的每一行创建一个对象?

当这些物品被垃圾收集

@Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final Cursor cursor = getItem(position);

        final FF_Task_List task = new FF_Task_List();
        task.setSiteArea(cursor.getString(TaskListEntry.TaskListQuery.SITE_AREA));
        task.setSiteCode(cursor.getString(TaskListEntry.TaskListQuery.SITE_CODE));
        task.setValidOn(cursor.getString(TaskListEntry.TaskListQuery.VALID_ON));
        task.setScore(cursor.getFloat(TaskListEntry.TaskListQuery.SCORE));
        task.setSurveyStatusId(cursor.getInt(TaskListEntry.TaskListQuery.SURVEY_STATUS_ID));
        task.setTokenId(cursor.getLong(TaskListEntry.TaskListQuery.TOKEN_ID));
        task.setEmpId(cursor.getLong(TaskListEntry.TaskListQuery.EMP_ID));
        task.setSurveyTypeId(cursor.getInt(TaskListEntry.TaskListQuery.SURVEY_TYPE_ID));


        final int scoreTextLength = String.valueOf(task.getScore()).length();
        final float score = task.getScore();

        final int scoreColor = Utilities.getColorByStatus(mContext, task.getSurveyStatusId());

        final int statusIcon = Utilities.getIconByStatus(task.getSurveyStatusId());
        final String validOnDate = Utilities.formatDBDate(task.getValidOn(), Utilities.Dates.DISPLAY_DATE);


        sb = new SpannableStringBuilder(task.getScore() + "%");
        sb.setSpan(new StyleSpan(Typeface.NORMAL), scoreTextLength, scoreTextLength + 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);


        holder.siteName.setText(task.getSiteArea());
        holder.siteCode.setText(task.getSiteCode());

        holder.siteInfo.setText(validOnDate);

        holder.siteScore.setTextColor(scoreColor);

        if(score != 0) {
            holder.siteScore.setPadding(5,0,0,0);
            holder.siteScore.setText(sb);
        }else{
            holder.siteScore.setText("--");
        }

        holder.siteScoreProgress.setPercent(score / 100);

        holder.siteStatusIcon.setImageResource(statusIcon);

        holder.taskItem.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                //raise custom itemClick event
                itemClickListener.itemClicked(task ,v);
            }
        });


    }

1 个答案:

答案 0 :(得分:1)

由于您将模型存储在列表中,因此每次在getItem(position)内调用onBindViewHolder(ViewHolder holder, int position)时都会获得该值。

RecyclerView可以随时控制内存中保存的内容,因此当您滚动RecyclerView内容(视图和模型)时,将会收到垃圾。< / p>

我不知道Android会在任何给定时间为您保留多少内存,但它只不过是屏幕上可见的项目 - 然后它可能会保留一些项目在视图之外创建。在手机上,这通常是10-15项,具体取决于屏幕尺寸和项目的大小。

然后当您再次滚动回相同的视图时,将再次重新创建模型,并使用新创建的值更新ViewHolder

除非您的数据模型很大,否则在onBindViewHolder(ViewHolder holder, int position)内创建对象不会有问题。

如果您想避免在onBindViewHolder内创建对象,请将Cursor转换为FF_Task_List个对象,并将FF_Task_List列表设置为{RecyclerView的支持模型1}}。