java - Listview 是滞后的,我无法解决这个问题
问题描述
我有一个列表视图,我在其中为列表中的每个项目分配一个图像视图。问题是,我已经做到了,应用程序一次只加载 10 行,并且当用户滚动时项目会增加,我启用了硬件加速,我将图片压缩并调整为很小的尺寸,但不管我做了什么列表视图仍然滞后。
我试图在网上查找,但我无法意识到如何在我的场景中实现任何东西,或者还有什么可以加速这个过程的东西。这是我的 BaseAdapter:
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = ((Activity)context).getLayoutInflater();
View view = layoutInflater.inflate(R.layout.library_layout, parent, false);
view.setBackgroundColor(Color.parseColor("#FFFFFF"));
final GamesLibrary gl = objects.get(position);
TextView title = (TextView)view.findViewById(R.id.titleId);
TextView excerpt = (TextView)view.findViewById(R.id.excerptId);
ImageView imageView = view.findViewById(R.id.listViewImageView);
ImageButton commBt = view.findViewById(R.id.goToCommLv);
final TextView author = view.findViewById(R.id.authorId);
final CheckBox likeBox = view.findViewById(R.id.likeIconLv);
ImageButton sharingButton = view.findViewById(R.id.shareButtonLv);
final SharedPreferences sp;
sp=context.getSharedPreferences("likes", 0);
final SharedPreferences.Editor editor = sp.edit();
String[] allFavsIds =SpIdstoArr(sp.getString("ids", ""));
final String id = String.valueOf(gl.getId());
SharedPreferences sp4 =context.getSharedPreferences("LocalLogInData", 0);
String uname= sp4.getString("Uname","dsufhsiudhfsdef");
if(gl.getTitle().contains(uname))
{
Log.d("aw12","aw12");
commBt.setClickable(false);
commBt.setEnabled(false);
commBt.setAlpha(0.5f);
}
title.setText(gl.getTitle());
Log.d("glgl",gl.getTitle());
excerpt.setText(gl.getExcerpt());
author.setText("by " + gl.getAuthor());
String FirstTag = "";
try {
FirstTag = gl.getTags()[0];
}
catch (Exception e)
{
Log.d("gameLibAdap", e.toString());}
if(FirstTag != null) {
if (FirstTag.equals("מערך אכפתיות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.care));
else if (FirstTag.equals("מערך חגים"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.holidays));
else if (FirstTag.equals("מערך חשיבה אחרת"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.thinkdifferent2));
else if (FirstTag.equals("מערך גיבוש והנאה"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.fun));
else if (FirstTag.equals("מערך חברות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.friendship));
else if (FirstTag.equals("מערך סובלנות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.tolerance));
else if (FirstTag.equals("מערך אחריות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.responsibility));
else if (FirstTag.equals("פעולות ללא מערך"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.logo1));
else if (FirstTag.equals("מערך שיתוף פעולה"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.teamwork));
else if (FirstTag.equals("מערך חוץ וטבע"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.nature));
else if (FirstTag.equals("מערך מנהיגות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.leading));
else if (FirstTag.equals("מערך סבלנות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.patience));
else if (FirstTag.equals("מערך יוזמה"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.yozma));
else if (FirstTag.equals("מערך שוויון"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.equlity));
else if (FirstTag.equals("מערך הישגים אישיים"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.personalachivements));
else if (FirstTag.equals("מערך עידן מודרני"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.modern));
else if (FirstTag.equals("ערך שוויון"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.equlity));
else if (FirstTag.equals("ערך ישראליות/ ציונות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.zionism));
else if (FirstTag.equals("מערך מודעות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.awareness2));
else if (FirstTag.equals("מערך חשיבה אחרת"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.thinkdifferent2));
else if (FirstTag.equals("מערך הישגים אישיים"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.personalachivements));
else if (FirstTag.equals("ערך קבלת השונה"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.acceptance));
else if (FirstTag.equals("אלכוהול וסמים"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.alcohol));
else if (FirstTag.equals("ללא הכנה מראש"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.unprepared));
else if (FirstTag.equals("מערך היכרות"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.meeting));
else if (FirstTag.equals("מערך הדרכה"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.guiding));
else if (FirstTag.equals("מערך יום הזיכרון"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.memorial));
else if (FirstTag.equals("מערך יום הזיכרון לשואה"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.holocaustmemorial));
else if (FirstTag.equals("מערך שינוי"))
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.change));
else
imageView.setImageDrawable(context.getApplicationContext().getResources().getDrawable(R.drawable.logo1));
}
likeBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
{
if(isChecked)
{
String value = sp.getString("ids", "");
Log.d("ids", value);
value += "," + id + "/";
editor.putString("ids", value).commit();
Log.d("ids", value);
Log.d("ids", sp.getString("ids", ""));
}
if(!isChecked)
{
String value = sp.getString("ids", "");
String replaceString= value.replace("," + id + "/", "");
editor.putString("ids", replaceString).commit();
Log.d("ids2", sp.getString("ids", ""));
}
Log.d("ids3", sp.getString("ids", ""));
}
});
if (checkMatch(String.valueOf(id),allFavsIds))
likeBox.setChecked(true);
else
likeBox.setChecked(false);
commBt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent in = new Intent(context,CommentActivity.class);
in.putExtra("Json", gl.getCommJson());
in.putExtra("pId", String.valueOf(id));
in.putExtra("cats", gl.getCategories());
context.startActivity(in);
}
});
sharingButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
shareIt(gl.getUrl(),gl.getTitle());
}
});
return view;}
我将解释一下,这样我的代码就不会混淆,我只是通过属性为每个项目分配文本和图像视图,还有一个赞按钮和一个评论按钮,将用户带到评论页面。你们知道我能做什么吗?
我是初学者。
更新:检查匹配代码:
public static boolean checkMatch(String id, String[] favIds)
{
boolean b = false;
for (int i = 0; i <favIds.length; i++)
{
if(favIds[i].equals(id)) {
b = true;
favIds[i] = "";
}
}
return b;
}
新代码 - ViewHlder:
class MyviewHolder
{
TextView title, excerpt,author;
ImageView imageView, profilepic;
ImageButton commBt,sharingButton;
CheckBox likeBox;
MyviewHolder(View v)
{
title = (TextView)v.findViewById(R.id.titleId);
excerpt = (TextView)v.findViewById(R.id.excerptId);
imageView =(ImageView) v.findViewById(R.id.listViewImageView);
commBt = (ImageButton) v.findViewById(R.id.goToCommLv);
author =(TextView) v.findViewById(R.id.authorId);
likeBox = (CheckBox) v.findViewById(R.id.likeIconLv);
sharingButton = (ImageButton) v.findViewById(R.id.shareButtonLv);
profilepic = v.findViewById(R.id.saProfilePic);
profilepic.setVisibility(View.VISIBLE);
}
}
新代码 - getView:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view =convertView;
MyviewHolder viewHolder=null;
if(view==null)
{
LayoutInflater layoutInflater = ((Activity)context).getLayoutInflater();
view = layoutInflater.inflate(R.layout.library_layout, parent, false);
viewHolder=new MyviewHolder(view);
view.setTag(viewHolder);
Log.d("gg22","creating");
view.setBackgroundColor(Color.parseColor("#FFFFFF"));
}
else
{
viewHolder = (MyviewHolder) view.getTag();
Log.d("gg22","recycling");
}
final GamesLibrary gl = objects.get(position);
viewHolder.title.setText(gl.getTitle());
viewHolder.excerpt.setText(gl.getExcerpt());
viewHolder.imageView.setImageResource(R.drawable.logo1);
viewHolder.author.setText("by " + gl.getAuthor());
final SharedPreferences sp;
sp=context.getSharedPreferences("likes", 0);
final SharedPreferences.Editor editor = sp.edit();
String[] allFavsIds =SpIdstoArr(sp.getString("ids", ""));
final String id = String.valueOf(gl.getId());
if(gl.getTitle().contains(UName()))
{
viewHolder.commBt.setClickable(false);
viewHolder.commBt.setEnabled(false);
viewHolder.commBt.setAlpha(0.5f);
}
int imageviewRID;
String FirstTag = "";
try {
FirstTag = gl.getTags()[0];
}
catch (Exception e)
{
Log.d("gameLibAdap", e.toString());}
if(FirstTag != null) {
if (FirstTag.equals("מערך אכפתיות"))
imageviewRID=R.drawable.care;
else if (FirstTag.equals("מערך חגים"))
imageviewRID=R.drawable.holidays;
else if (FirstTag.equals("מערך חשיבה אחרת"))
imageviewRID=R.drawable.thinkdifferent2;
else if (FirstTag.equals("מערך גיבוש והנאה"))
imageviewRID=R.drawable.fun;
else if (FirstTag.equals("מערך חברות"))
imageviewRID=R.drawable.friendship;
else if (FirstTag.equals("מערך סובלנות"))
imageviewRID=R.drawable.tolerance;
else if (FirstTag.equals("מערך אחריות"))
imageviewRID=R.drawable.responsibility;
else if (FirstTag.equals("פעולות ללא מערך"))
imageviewRID=R.drawable.logo1;
else if (FirstTag.equals("מערך שיתוף פעולה"))
imageviewRID=R.drawable.teamwork;
else if (FirstTag.equals("מערך חוץ וטבע"))
imageviewRID=R.drawable.nature;
else if (FirstTag.equals("מערך מנהיגות"))
imageviewRID=R.drawable.leading;
else if (FirstTag.equals("מערך סבלנות"))
imageviewRID=R.drawable.patience;
else if (FirstTag.equals("מערך יוזמה"))
imageviewRID=R.drawable.yozma;
else if (FirstTag.equals("מערך שוויון"))
imageviewRID=R.drawable.equlity;
else if (FirstTag.equals("מערך הישגים אישיים"))
imageviewRID=R.drawable.personalachivements;
else if (FirstTag.equals("מערך עידן מודרני"))
imageviewRID=R.drawable.modern;
else if (FirstTag.equals("ערך שוויון"))
imageviewRID=R.drawable.equlity;
else if (FirstTag.equals("ערך ישראליות/ ציונות"))
imageviewRID=R.drawable.zionism;
else if (FirstTag.equals("מערך מודעות"))
imageviewRID=R.drawable.awareness2;
else if (FirstTag.equals("מערך חשיבה אחרת"))
imageviewRID=R.drawable.thinkdifferent2;
else if (FirstTag.equals("מערך הישגים אישיים"))
imageviewRID=R.drawable.personalachivements;
else if (FirstTag.equals("ערך קבלת השונה"))
imageviewRID=R.drawable.acceptance;
else if (FirstTag.equals("אלכוהול וסמים"))
imageviewRID=R.drawable.alcohol;
else if (FirstTag.equals("ללא הכנה מראש"))
imageviewRID=R.drawable.unprepared;
else if (FirstTag.equals("מערך היכרות"))
imageviewRID=R.drawable.meeting;
else if (FirstTag.equals("מערך הדרכה"))
imageviewRID=R.drawable.guiding;
else if (FirstTag.equals("מערך יום הזיכרון"))
imageviewRID=R.drawable.memorial;
else if (FirstTag.equals("מערך יום הזיכרון לשואה"))
imageviewRID=R.drawable.holocaustmemorial;
else if (FirstTag.equals("מערך שינוי"))
imageviewRID=R.drawable.change;
else
imageviewRID=R.drawable.logo1;
viewHolder.imageView.setImageResource(imageviewRID);
}
viewHolder.likeBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
{
if(isChecked)
{
String value = sp.getString("ids", "");
Log.d("ids", value);
value += "," + id + "/";
editor.putString("ids", value).apply();
Log.d("ids", value);
Log.d("ids", sp.getString("ids", ""));
}
if(!isChecked)
{
String value = sp.getString("ids", "");
String replaceString= value.replace("," + id + "/", "");
editor.putString("ids", replaceString).apply();
Log.d("ids2", sp.getString("ids", ""));
}
Log.d("ids3", sp.getString("ids", ""));
}
});
if (checkMatch(String.valueOf(id),allFavsIds))
viewHolder.likeBox.setChecked(true);
else
viewHolder.likeBox.setChecked(false);
viewHolder.commBt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent in = new Intent(context,CommentActivity.class);
in.putExtra("Json", gl.getCommJson());
in.putExtra("pId", String.valueOf(id));
in.putExtra("cats", gl.getCategories());
context.startActivity(in);
}
});
viewHolder.sharingButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
shareIt(gl.getUrl(),gl.getTitle());
}
});
return view;
}
解决方案
这可以通过View Holder 模式得到改善。与其为每个项目膨胀一个新视图并进行所有样板设置,不如重用以前为现在不在可见区域的项目创建的视图。
请注意,这已经回答了好几次了。看看以下问题和答案:
我会改变其他事情以使其更高效:
- 删除对“正常”行为的例外使用。代码通常针对非异常流(需要引用)进行优化,因此经常遇到 catch 块可能是个问题。
- 从 切换
SharedPreferences.Editor.commit()
到SharedPreferences.Editor.apply()
。根据文档commit()
同步写入磁盘,而apply()
仅写入内存结构并异步写入磁盘。这里的问题可能是您先创建侦听器,然后调用setChecked
. 检查监听器是否在被调用时setChecked
被调用,并setChecked
在代码中切换监听器的创建和。 - 看看长
if ... else ... if
是不是问题。试试地图。 - 不要为每个新项目创建新的侦听器。每个创建一次
ViewHolder
,将gl
项目设置ViewHolder
为字段,并在侦听器中引用该字段。
如果您想花哨,请使用Android Profiler来衡量该方法的性能,并查看您花费最多时间的地方。
推荐阅读
- python - vsCode / sqlite3中的CWD
- html - 您可以在对象标签中设置元素的样式吗?
- apache-spark - 在 Kubernetes 上使用 Spark 写入输出时出现 chmod 错误
- php - 如何处理 SAML 响应并获取 CodeIgniter 中的属性?
- php - Elementor 导航包含无效标签
- sql - 在插入查询中使用表的主键作为外键
- displaytag - Displaytag:如何选择要在表格分页中显示的页面
- flutter - Moving an icon into a TextField `leading` icon
- node.js - 调试从不解决承诺/异步等待
- c# - 异步方法和 EntityFramework Core 中的 String.Compare