这是我的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);
}
});
}
答案 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}}。