简体   繁体   English

自定义ListView + getView方法

[英]Custom ListView + getView method

I need help with custom adapter with getView() method. 我需要使用getView()方法的自定义适配器的帮助。 When adapter create a list in getView() method called every time rendering like holder.textEpisode.setTextColor() etc. This gives heavy load and the list begins to slow down. 当适配器在每次渲染时都在getView()方法中创建一个列表,每次调用时都类似holder.textEpisode.setTextColor()等。这会增加负担,列表开始变慢。
Please help me solve this problem. 请帮我解决这个问题。 Thanks! 谢谢!

public class myAdapterDouble extends ArrayAdapter<Order> {

private int[] colorWhite = new int[] { -0x1 };
private int[] colors = new int[] { -0x1, -0x242425 };
private int[] colorBlack = new int[] { -0x1000000 };
private int[] colorTransparent = new int[] { android.R.color.transparent };
private LayoutInflater lInflater;
private ArrayList<Order> data;
private Order o;
private DisplayImageOptions options;
private ImageLoader imageLoader;
private ImageLoaderConfiguration config;
private Context ctx;
private Typeface tf;

public myAdapterDouble(Context c, int listItem, ArrayList<Order> data) {
super(c, listItem, data);
lInflater = LayoutInflater.from(c);
this.data = data;
ctx = c;

tf = Typeface.createFromAsset(ctx.getAssets(), "meiryo.ttc");

imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
        .showStubImage(R.drawable.no_image)
        .showImageForEmptyUri(R.drawable.no_image).cacheOnDisc()
        .cacheInMemory().build();

config = new ImageLoaderConfiguration.Builder(c.getApplicationContext())
        .threadPriority(Thread.NORM_PRIORITY - 2)
        .memoryCacheSize(2 * 1024 * 1024)  // 2 Mb
        .memoryCacheExtraOptions(100, 100)
        .denyCacheImageMultipleSizesInMemory()
        .discCacheFileNameGenerator(new Md5FileNameGenerator())
        .tasksProcessingOrder(QueueProcessingType.LIFO).enableLogging()
        .build();
ImageLoader.getInstance().init(config);
}

SharedPreferences sharedPref;
boolean posters, fixFont;
float headerSize, timeSize, dateSize;
int imageWSize;

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

ViewHolder holder = null;
o = data.get(position);

sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx);
posters = sharedPref.getBoolean("poster", true);
fixFont = sharedPref.getBoolean("fix_font", false);

if (convertView == null) {
    convertView = lInflater.inflate(R.layout.double_list_item, null);
    holder = new ViewHolder();
    holder.textName = (TextView) convertView.findViewById(R.id.text);   
    if (fixFont) {
        try {
            holder.textName.setTypeface(tf);
        } catch (Exception e) {
            Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
        }
    } else {
        try {
            holder.textName.setTypeface(Typeface.DEFAULT);
        } catch (Exception e) {
            Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
        }
    }
    holder.textEpisode = (TextView) convertView.findViewById(R.id.text2);
    holder.img = (ImageView) convertView.findViewById(R.id.image);

    String width = sharedPref.getString("image_width", "70");
    imageWSize = Integer.parseInt(width); // ширина
    final float scale = getContext().getResources().getDisplayMetrics().density;
    int px = (int) (imageWSize*scale + 0.5f);

    holder.img.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
    holder.img.getLayoutParams().width = px;
    if(imageWSize == 0) {
        holder.img.getLayoutParams().width = LayoutParams.WRAP_CONTENT;
    }
    holder.img.setPadding(5, 5, 5, 5);

    convertView.setTag(holder);
} else {
    holder = (ViewHolder) convertView.getTag();
}

headerSize = Float.parseFloat(sharedPref.getString("headsize", "20"));
holder.textName.setTextSize(headerSize); // размер названия
timeSize = Float.parseFloat(sharedPref.getString("timesize", "15"));
holder.textEpisode.setTextSize(timeSize); // размер времени

if (posters) {
    holder.img.setVisibility(View.VISIBLE);
    try {
        imageLoader.displayImage(o.getLink(), holder.img, options);
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
} else {
    holder.img.setVisibility(View.GONE);
}

holder.img.setTag(o);
holder.textName.setText(o.getTextName());
holder.textEpisode.setText(o.getTextEpisode());
holder.textEpisode.setTextColor(Color.BLACK);

if (o.getTextEpisode().toString().contains(ctx.getString(R.string.final_ep))) { 
    String finaleColor = sharedPref.getString("finale_color", "1");
    if (finaleColor.contains("default")) {
        holder.textEpisode.setTextColor(Color.parseColor("#2E64FE"));
    }
    if (finaleColor.contains("yelow")) {
        holder.textEpisode.setTextColor(Color.YELLOW);
    }
    if (finaleColor.contains("red")) {
        holder.textEpisode.setTextColor(Color.RED);
    }
    if (finaleColor.contains("green")) {
        holder.textEpisode.setTextColor(Color.GREEN);
    }
    if (finaleColor.contains("white")) {
        holder.textEpisode.setTextColor(Color.WHITE);
    }
    if (finaleColor.contains("gray")) {
        holder.textEpisode.setTextColor(Color.GRAY);
    }           
} else {
    holder.textEpisode.setTextColor(Color.parseColor("#2E64FE"));
}

String chooseColor = sharedPref.getString("colorList", "");
if (chooseColor.contains("white")) {
    int colorPos = position % colorWhite.length;
    convertView.setBackgroundColor(colorWhite[colorPos]);
}
if (chooseColor.contains("black")) {
    int colorPos = position % colorBlack.length;
    convertView.setBackgroundColor(colorBlack[colorPos]);
    holder.textName.setTextColor(Color.parseColor("#FFFFFF"));
}
if (chooseColor.contains("whitegray")) {
    int colorPos = position % colors.length;
    convertView.setBackgroundColor(colors[colorPos]);
}
if (chooseColor.contains("transparent")) {
    int colorPos = position % colorTransparent.length;
    convertView.setBackgroundColor(colorTransparent[colorPos]);
}

return convertView;
}

getView() method will be called every time when u do a scroll for loading next items. 每次您滚动滚动以加载下一项时,都会调用getView()方法。

sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx);
posters = sharedPref.getBoolean("poster", true);
fixFont = sharedPref.getBoolean("fix_font", false);

This should slow the scroll since every time it need to read and parse the preference. 由于每次需要读取和解析首选项时,滚动速度都会降低。

Have all those preferences been loaded once as some variables. 是否已将所有这些首选项作为某些变量加载一次。

If that still does not solved the problem that try Method Profiling and check whats Incl% for the getView Method and see which methods is taking more cpu usage in getView. 如果仍然不能解决问题,请尝试“ 方法概要分析”,并检查getView方法的Incl%,并查看哪些方法在getView中占用更多的CPU使用率。

EDITED 已编辑

public class myAdapterDouble extends ArrayAdapter<Order> {
    private int[] colorWhite = new int[] { -0x1 };
    private int[] colors = new int[] { -0x1, -0x242425 };
    private int[] colorBlack = new int[] { -0x1000000 };
    private int[] colorTransparent = new int[] { android.R.color.transparent };
    private LayoutInflater lInflater;
    private ArrayList<Order> data;
    private Order o;
    private DisplayImageOptions options;
    private ImageLoader imageLoader;
    private ImageLoaderConfiguration config;
    private Context ctx;
    private Typeface tf;


    boolean posters, fixFont;
    float headerSize, timeSize, dateSize;
    int imageWSize;
    private String finaleColor;
    private String chooseColor;
    private String final_ep;

    public myAdapterDouble(Context c, int listItem, ArrayList<Order> data) {
        super(c, listItem, data);
        lInflater = LayoutInflater.from(c);
        this.data = data;
        ctx = c;

        tf = Typeface.createFromAsset(ctx.getAssets(), "meiryo.ttc");

        imageLoader = ImageLoader.getInstance();
        options = new DisplayImageOptions.Builder().showStubImage(R.drawable.no_image).showImageForEmptyUri(R.drawable.no_image).cacheOnDisc().cacheInMemory().build();

        config = new ImageLoaderConfiguration.Builder(c.getApplicationContext()).threadPriority(Thread.NORM_PRIORITY - 2).memoryCacheSize(2 * 1024 * 1024)
                // 2 Mb
                .memoryCacheExtraOptions(100, 100).denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO)
                .enableLogging().build();
        ImageLoader.getInstance().init(config);

        SharedPreferences sharedPref;

        sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx);
        posters = sharedPref.getBoolean("poster", true);
        fixFont = sharedPref.getBoolean("fix_font", false);

        String width = sharedPref.getString("image_width", "70");
        imageWSize = Integer.parseInt(width); // ширина
        headerSize = Float.parseFloat(sharedPref.getString("headsize", "20"));
        timeSize = Float.parseFloat(sharedPref.getString("timesize", "15"));

        finaleColor = sharedPref.getString("finale_color", "1");
        chooseColor = sharedPref.getString("colorList", "");
        final_ep = ctx.getString(R.string.final_ep);
    }

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

        ViewHolder holder = null;
        o = data.get(position);

        if (convertView == null) {
            convertView = lInflater.inflate(R.layout.double_list_item, null);
            holder = new ViewHolder();
            holder.textName = (TextView) convertView.findViewById(R.id.text);
            if (fixFont) {
                try {
                    holder.textName.setTypeface(tf);
                }
                catch (Exception e) {
                    Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
                }
            }
            else {
                try {
                    holder.textName.setTypeface(Typeface.DEFAULT);
                }
                catch (Exception e) {
                    Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
                }
            }
            holder.textEpisode = (TextView) convertView.findViewById(R.id.text2);
            holder.img = (ImageView) convertView.findViewById(R.id.image);


            final float scale = getContext().getResources().getDisplayMetrics().density;
            int px = (int) (imageWSize * scale + 0.5f);

            holder.img.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
            holder.img.getLayoutParams().width = px;
            if (imageWSize == 0) {
                holder.img.getLayoutParams().width = LayoutParams.WRAP_CONTENT;
            }
            holder.img.setPadding(5, 5, 5, 5);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }


        holder.textName.setTextSize(headerSize); // размер названия

        holder.textEpisode.setTextSize(timeSize); // размер времени

        if (posters) {
            holder.img.setVisibility(View.VISIBLE);
            try {
                imageLoader.displayImage(o.getLink(), holder.img, options);
            }
            catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
        else {
            holder.img.setVisibility(View.GONE);
        }

        holder.img.setTag(o);
        holder.textName.setText(o.getTextName());
        holder.textEpisode.setText(o.getTextEpisode());
        holder.textEpisode.setTextColor(Color.BLACK);


        if (o.getTextEpisode().toString().contains()) {

            if (finaleColor.contains("default")) {
                holder.textEpisode.setTextColor(Color.parseColor("#2E64FE"));
            }
            if (finaleColor.contains("yelow")) {
                holder.textEpisode.setTextColor(Color.YELLOW);
            }
            if (finaleColor.contains("red")) {
                holder.textEpisode.setTextColor(Color.RED);
            }
            if (finaleColor.contains("green")) {
                holder.textEpisode.setTextColor(Color.GREEN);
            }
            if (finaleColor.contains("white")) {
                holder.textEpisode.setTextColor(Color.WHITE);
            }
            if (finaleColor.contains("gray")) {
                holder.textEpisode.setTextColor(Color.GRAY);
            }
        }
        else {
            holder.textEpisode.setTextColor(Color.parseColor("#2E64FE"));
        }


        if (chooseColor.contains("white")) {
            int colorPos = position % colorWhite.length;
            convertView.setBackgroundColor(colorWhite[colorPos]);
        }
        if (chooseColor.contains("black")) {
            int colorPos = position % colorBlack.length;
            convertView.setBackgroundColor(colorBlack[colorPos]);
            holder.textName.setTextColor(Color.parseColor("#FFFFFF"));
        }
        if (chooseColor.contains("whitegray")) {
            int colorPos = position % colors.length;
            convertView.setBackgroundColor(colors[colorPos]);
        }
        if (chooseColor.contains("transparent")) {
            int colorPos = position % colorTransparent.length;
            convertView.setBackgroundColor(colorTransparent[colorPos]);
        }

        return convertView;
    }
}

try like this instead of viewholder this works perfectly for me. 像这样尝试代替viewholder这对我来说非常合适。

public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
sharedPref = PreferenceManager.getDefaultSharedPreferences(ctx);
posters = sharedPref.getBoolean("poster", true);
fixFont = sharedPref.getBoolean("fix_font", false);

if (v == null) {
    LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = vi.inflate(R.layout.double_list_item, null);
}

TextView textName = (TextView) v.findViewById(R.id.text);
if (fixFont){
   try {
        textName.setTypeface(tf);
   } catch (Exception e) {
        Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
   }
}else {
   try {
        textName.setTypeface(Typeface.DEFAULT);
   } catch (Exception e) {
        Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
   }
}
return super.getView(position, v, parent);
}
};

I hope this will help you. 我希望这能帮到您。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在自定义ListView中调用getView()方法 - Calling getView() method in custom ListView 在重写用于列表视图的自定义适配器的getview方法之后,在列表视图中什么也看不到 - after override getview method for custom adapter for a listview,see nothing in listview 多次调用自定义列表视图适配器 getView 方法,并且顺序不一致 - custom listview adapter getView method being called multiple times, and in no coherent order 如何将自定义getView绑定到ListView适配器? - How to bind custom getView to ListView adapter? 在带有gridview的自定义适配器中未调用getView()方法 - getView() method is not called in custom adapter with gridview 谁调用自定义ArrayAdapter类的getView()方法 - Who calls the getView() method of custom ArrayAdapter class 我可以从自定义适配器的getView填充一个listview吗? - Can I populate a listview from getView of a custom adapter? 如何获取ArrayList <String> 图像URL到ListView的ImageView中的getView方法 - How to get ArrayList<String> image URLs into ImageView of ListView getView method 我的 getView 方法没有被调用以在列表视图中填充数据 - My getView method is not getting called for populating datas in listview 未调用Android 2.3自定义ArrayAdapter getView方法 - Android 2.3 Custom ArrayAdapter getView Method Not Being Called
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM