【问题标题】:Custom listview is too slow自定义列表视图太慢
【发布时间】:2015-12-31 12:43:47
【问题描述】:

好吧,我的自定义列表视图非常慢,几乎无法使用,我已经阅读了很多帖子但没有人帮助我修复它,我希望你们中的一个可以,谢谢。

这是我的项目列表视图 xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="300px"
        android:id="@id/iv_tipo"
        android:scaleType="centerCrop"
        android:layout_marginLeft="5px"
        android:layout_marginRight="5px"
        />



        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/material_blue_grey_800"
            android:textColor="#ffffff"
            android:textAlignment="center"
            android:textSize="27px"
            android:paddingLeft="10px"
            android:id="@id/tv_titulo"
            android:paddingTop="10px"
            android:paddingBottom="20px"
            android:paddingRight="5px"
            android:layout_marginLeft="5px"
            android:layout_marginRight="5px"/>



</LinearLayout>

这是适配器

public class TrucoListAdapter extends ArrayAdapter {

    ArrayList<Truco> trucos;

    public TrucoListAdapter(Context context, ArrayList<Truco> trucos) {
        super(context, 0, trucos);
        trucos = this.trucos;

    }

    @Override
    public Object getItem(int position) {
        return super.getItem(super.getCount() - position - 1);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.truco_list_item, null);

        }


        ImageView ivTipo = (ImageView) convertView.findViewById(R.id.iv_tipo);
        TextView tvTitulo = (TextView) convertView.findViewById(R.id.tv_titulo);

        Truco truco = (Truco)getItem(position);

        switch (truco.getTipo()) {
            case "m":
                ivTipo.setImageResource(R.drawable.coins);
                break;
            case "c":
                ivTipo.setImageResource(R.drawable.cards);
                break;
            case "a":
                ivTipo.setImageResource(R.drawable.guess);
                break;
            case "d":
                ivTipo.setImageResource(R.drawable.desa);
                break;
            default:
                ivTipo.setImageResource(R.drawable.home);

        }

            tvTitulo.setText(truco.getTitulo());

        return convertView;
    }

}

编辑:我按照@KishanSoni 的建议修改了我的适配器,但它仍然很慢。

【问题讨论】:

  • 那是因为你没有使用 ViewHolder pattern
  • @EpicPandaForce 感谢您的快速回答,我尝试了一次但没有解决问题
  • 首先使用BaseAdapter而不是ArrayAdapter
  • 使用像Picasso or UIL or Glide这样的图像缓存库加载图像..这是你的列表视图滞后的唯一原因..

标签: android performance listview adapter android-custom-view


【解决方案1】:

一些问题-

Truco 类:getTito() 和 getTitulo()- 他们做任何昂贵的处理吗?

drawables 小吗(图标大小)? IE,你在处理 20 万个可绘制对象吗?

您将多少个 trucos 加载到数组列表中?

抱歉,由于代表人数少,我无法将此添加为评论。

【讨论】:

    【解决方案2】:

    使用基本适配器而不是阵列适配器 也使用持有人模式, 例如,我给你它的样本

    public class MyAdpt extends BaseAdapter {
    
        private LayoutInflater mInflater;
    
        public ArrayList<String> mdata;
    
        public MyAdpt (ArrayList<String> data) {
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mdata = data;
        }
    
        @Override
        public int getCount() {
            return mdata.size();
        }
    
        @Override
        public Object getItem(int position) {
            return mdata.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            final ItemViewHolder itemHolder;
    
            if (convertView == null) {
                itemHolder = new ItemViewHolder();
                convertView = mInflater.inflate(R.layout.row_layout, null);
                itemHolder.textview= (TextView) convertView.findViewById(R.id.textview);
                convertView.setTag(itemHolder);
            } else {
                itemHolder = (ItemViewHolder) convertView.getTag();
            }
    
            itemHolder.textview.setText(mdata.get(position));
    
            return convertView;
        }
    
        public class ItemViewHolder {
            TextView textview;
        }
    }
    

    编辑:

    public class TrucoListAdapter extends BaseAdapter {
    
    ArrayList<Truco> trucos;
    
    public TrucoListAdapter(Context context, ArrayList<Truco> trucos) {
        super(context, 0, trucos);
        trucos = this.trucos;
    }
    
    @Override
    public int getCount() {
        return trucos.size();
    }
    
    @Override
    public Object getItem(int position) {
        return trucos.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        final ItemViewHolder itemHolder;
    
        if (convertView == null) {
            itemHolder = new ItemViewHolder();
            LayoutInflater inflater = (LayoutInflater) parent.getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.truco_list_item, null);
    
            itemHolder.ImageView ivTipo = (ImageView) convertView.findViewById(R.id.iv_tipo);
            itemHolder.TextView tvTitulo = (TextView) convertView.findViewById(R.id.tv_titulo);
            convertView.setTag(itemHolder);
        } else {
            itemHolder = (ItemViewHolder) convertView.getTag();
        }
    
        Truco truco = (Truco) getItem(position);
    
        switch (truco.getTipo()) {
        case "m":
            ivTipo.setImageResource(R.drawable.coins);
            break;
        case "c":
            ivTipo.setImageResource(R.drawable.cards);
            break;
        case "a":
            ivTipo.setImageResource(R.drawable.guess);
            break;
        case "d":
            ivTipo.setImageResource(R.drawable.desa);
            break;
        default:
            ivTipo.setImageResource(R.drawable.home);
    
        return convertView;
    }
    
    public class ItemViewHolder {
        ImageView ivTipo;
        TextView tvTitulo;
    }
    }
    

    【讨论】:

    • 我和你完全一样,但它仍然很慢/:@KishanSoni
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2011-07-25
    • 2023-04-06
    • 2015-12-22
    • 2018-05-10
    相关资源
    最近更新 更多