gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:32:31 24 4
gpt4 key购买 nike

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

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

据我所知,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);
}
});


}

最佳答案

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

RecyclerView 随时控制内存中保存的内容,因此当您滚动 RecyclerView 时,内容( View 和模型)将在需要时进行垃圾收集.

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

然后,当您再次滚动回相同的 View 时,将再次重新创建模型,并且 ViewHolder 将更新为新创建的值。

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

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

关于android - 在 recyclerview OnBindViewHolder 方法中为每一行创建 POJO 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35561511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com