首页 > 解决方案 > 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;
}

标签: javaandroid

解决方案


这可以通过View Holder 模式得到改善。与其为每个项目膨胀一个新视图并进行所有样板设置,不如重用以前为现在不在可见区域的项目创建的视图。

请注意,这已经回答了好几次了。看看以下问题和答案:

我会改变其他事情以使其更高效:

  • 删除对“正常”行为的例外使用。代码通常针对非异常流(需要引用)进行优化,因此经常遇到 catch 块可能是个问题。
  • 从 切换SharedPreferences.Editor.commit()SharedPreferences.Editor.apply()。根据文档commit()同步写入磁盘,而apply()仅写入内存结构并异步写入磁盘。这里的问题可能是您先创建侦听器,然后调用setChecked. 检查监听器是否在被调用时setChecked被调用,并setChecked在代码中切换监听器的创建和。
  • 看看长if ... else ... if是不是问题。试试地图。
  • 不要为每个新项目创建新的侦听器。每个创建一次ViewHolder,将gl项目设置ViewHolder为字段,并在侦听器中引用该字段。

如果您想花哨,请使用Android Profiler来衡量该方法的性能,并查看您花费最多时间的地方。


推荐阅读