自定义列表视图太慢了

时间:2015-12-31 12:43:48

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

我的自定义列表视图非常慢,几乎无法使用,我一直在阅读很多帖子,但没有人帮我修复它,我希望你们中的一个能够,谢谢。

这是我的项目listview xml

<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-token</artifactId>
    <version>4.6.RC1</version>
</dependency>
<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-pades</artifactId>
    <version>4.6.RC1</version>
</dependency>
<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-cades</artifactId>
    <version>4.6.RC1</version>
</dependency>
<dependency>
    <groupId>eu.europa.ec.joinup.sd-dss</groupId>
    <artifactId>dss-document</artifactId>
    <version>4.6.RC1</version>
</dependency>

这是适配器

<?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>

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

2 个答案:

答案 0 :(得分:0)

使用Base Adapter而不是Array Adapter 还使用Holder Pattern, 例如我给你的样品

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;
}
}

答案 1 :(得分:0)

一些问题 -

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

drawables是否小(图标大小)? IE,你在处理200K drawables吗?

你加载到arraylist中有多少个trucos?

很抱歉,由于代表不足,我无法将其添加为评论。