使用本地图像进行ListView优化

时间:2014-04-24 01:22:29

标签: android listview android-listview

我有ListView使用自定义适配器,自定义适配器使用来自JsonObject数组的数据(是的,不是JsonArray),我的列表似乎相当迟缓,我有使用了持有者模式并清除了我getView()方法中几乎所有对象实例,我还有哪些替代方案?现在它是特定列表中负载最多的,48个元素具有以下膨胀视图:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp" >

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_weight="1" >

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:textSize="15sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/comment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top" />
</LinearLayout>

<TextView
    android:id="@+id/price"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="0.8"
    android:gravity="right|center_vertical"
    android:textSize="35sp"
    android:textStyle="bold"
    android:textColor="@color/dark_green" />

<TextView
    android:id="@+id/curr"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="0.3"
    android:gravity="left|center_vertical"
    android:paddingLeft="5dp"
    android:textSize="14sp" />

</LinearLayout>

我的Adapter类看起来像这样:

public class DetalleJsonAdapter extends ArrayAdapter<JsonObject> {

Context context;
int layoutResourceId;
JsonObject data[] = null;

public DetalleJsonAdapter(Context context, int layoutResourceId,
        JsonObject[] data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    JsonObjectHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new JsonObjectHolder();
        holder.flagIcon1 = (ImageView) row.findViewById(R.id.flagIcon1);
        holder.score = (TextView) row.findViewById(R.id.score);
        holder.flagIcon2 = (ImageView) row.findViewById(R.id.flagIcon2);

        row.setTag(holder);
    } else {
        holder = (JsonObjectHolder) row.getTag();
    }

    JsonObject jso = data[position];
    holder.flagIcon1.setImageResource(FlagUtil.getFlagByIntCode(jso.get(
            "url_icon1").getAsString()));
    holder.score.setText(jso.get("goles_estimados_e1").getAsString()
            + " - " + jso.get("goles_estimados_e2").getAsString());
    holder.flagIcon2.setImageResource(FlagUtil.getFlagByIntCode(jso.get(
            "url_icon2").getAsString()));
    return row;
}

static class JsonObjectHolder {
    ImageView flagIcon1;
    TextView score;
    ImageView flagIcon2;
}
}

请记住,列表元素也会有一个没有在这个版本中实现的点击监听器,我真的不知道会有什么性能影响,但除了我所做的,还有什么可以我为这个列表表现吗?我担心我的大部分问题都是由于重复使用setImageResource(),我有什么选择?

修改:getFlagByIntCode()代码:

package com.tghsistemas.curia.quini.util;

import com.tghsistemas.curia.quini.csquini.R;

公共类FlagUtil {

public static int getFlagByIntCode(String code) {

    if (code.equals("ALG")) {
        return R.drawable.flag_circle_alg;
    } else if (code.equals("ARG")) {
        return R.drawable.flag_circle_arg;
    } else if (code.equals("AUS")) {
        return R.drawable.flag_circle_aus;
    } else if (code.equals("BEL")) {
        return R.drawable.flag_circle_bel;
    } else if (code.equals("BRA")) {
        return R.drawable.flag_circle_bra;
    } else if (code.equals("BIH")) {
        return R.drawable.flag_circle_bih;
    } else if (code.equals("CHI")) {
        return R.drawable.flag_circle_chi;
    } else if (code.equals("CIV")) {
        return R.drawable.flag_circle_civ;
    } else if (code.equals("CMR")) {
        return R.drawable.flag_circle_cmr;
    } else if (code.equals("COL")) {
        return R.drawable.flag_circle_col;
    } else if (code.equals("CRC")) {
        return R.drawable.flag_circle_crc;
    } else if (code.equals("CRO")) {
        return R.drawable.flag_circle_cro;
    } else if (code.equals("ECU")) {
        return R.drawable.flag_circle_ecu;
    } else if (code.equals("ENG")) {
        return R.drawable.flag_circle_eng;
    } else if (code.equals("ESP")) {
        return R.drawable.flag_circle_esp;
    } else if (code.equals("FRA")) {
        return R.drawable.flag_circle_fra;
    } else if (code.equals("GER")) {
        return R.drawable.flag_circle_ger;
    } else if (code.equals("GHA")) {
        return R.drawable.flag_circle_gha;
    } else if (code.equals("GRE")) {
        return R.drawable.flag_circle_gre;
    } else if (code.equals("HON")) {
        return R.drawable.flag_circle_hon;
    } else if (code.equals("IRN")) {
        return R.drawable.flag_circle_irn;
    } else if (code.equals("ITA")) {
        return R.drawable.flag_circle_ita;
    } else if (code.equals("JPN")) {
        return R.drawable.flag_circle_jpn;
    } else if (code.equals("KOR")) {
        return R.drawable.flag_circle_kor;
    } else if (code.equals("MEX")) {
        return R.drawable.flag_circle_mex;
    } else if (code.equals("NED")) {
        return R.drawable.flag_circle_ned;
    } else if (code.equals("NIG")) {
        return R.drawable.flag_circle_nig;
    } else if (code.equals("POR")) {
        return R.drawable.flag_circle_por;
    } else if (code.equals("RUS")) {
        return R.drawable.flag_circle_rus;
    } else if (code.equals("SWE")) {
        return R.drawable.flag_circle_swe;
    } else if (code.equals("URU")) {
        return R.drawable.flag_circle_uru;
    } else if (code.equals("USA")) {
        return R.drawable.flag_circle_usa;
    } else {
        return R.drawable.red_shell_placeholder;
    }

}

}

0 个答案:

没有答案