Android SecionList和Holder [英] Android SecionList and Holder

查看:63
本文介绍了Android SecionList和Holder的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带有部分的列表,但是这个ListView非常慢.

I have list with section, but this ListView is very slow.

我需要任何持有人,但我不知道该怎么做.

I need any holder, but i don't know how I can make it.

当我有一种视图时,这很简单,但是在这里我遇到了问题.

When I had one type of view it was simple, but here I have problem.

我创建了持有人,但是当显示ListView时,我看到了:

I create holder, but when ListView is showing, I see:

"titel","title","title","item","item"

"titel","title","title","item","item"

"titel","title","title","item"

"titel","title","title","item"

"titel","title","title","item","item","item"

"titel","title","title","item","item","item"

这是我的代码:

public class EntryAdapter extends ArrayAdapter<Item> {

private ArrayList<Item> items;
private LayoutInflater vi;
Context context;
private String nazwa;

public EntryAdapter(Context context,ArrayList<Item> items, String nazwa) {
    super(context,0, items);
    this.items = items;
    this.context = context;
    this.nazwa = nazwa;
    vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

我得到了视图:

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

    final Item i = items.get(position);
    if (i != null) {
        if(i.isSection()){
            SectionItem si = (SectionItem)i;
            convertView = vi.inflate(R.layout.list_item_section, null);

            convertView.setOnClickListener(null);
            convertView.setOnLongClickListener(null);
            convertView.setLongClickable(false);

            final TextView sectionView = (TextView) convertView.findViewById(R.id.list_item_section_text);
        }else{
                Obiekt ei = (Obiekt)i;
                convertView = vi.inflate(R.layout.row_list, null);
                final TextView title = (TextView)convertView.findViewById(R.id.row_tytul);
                final TextView odleglosc = (TextView)convertView.findViewById(R.id.row_odleglosc);
                final ImageView obrazek = (ImageView)convertView.findViewById(R.id.row_ikona_mala);
                final LinearLayout pole = (LinearLayout)convertView.findViewById(R.id.LinearLayout1);

        }
    }
    return convertView;
}

推荐答案

我有带有部分的列表,但是这个ListView非常慢.

I have list with section, but this ListView is very slow.

您总是在getView()方法中扩大一个新视图. 放大视图通常需要很长时间.

You are always inflating a new view in your getView() method. Inflating a view, typically takes a long time.

您想通过检查'convertView'是否为null来重用以前的视图.这将提高性能.注意,您还必须实现getItemViewType()getViewTypeCount(),因为您有两个不同的视图:

You want to re-use previous views, by checking if the 'convertView' is null or not. This will increase the performance. NOTE, you also have to implement getItemViewType() and getViewTypeCount() since you have two different views:

public class MyAdapter extends ArrayAdapter<Item> {

    private List<Item> items;
    private int TYPE_SECTION = 0;
    private int TYPE_OBIEKT = 1;
    private static LayoutInflater vi;

    public MyAdapter(Context context, List<Item> _items) {
        super(context, 0);
        vi = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
        items = _items;
    }

    @Override
    public int getCount() {
        return items.size();
    }


    /**
     * @see android.widget.BaseAdapter#getViewTypeCount()
     * Determines how many different views you have
     */
    @Override
    public int getViewTypeCount() {
        return 2; // We have two different kinds of views
    }

    /**
     * @see android.widget.BaseAdapter#getItemViewType(int)
     */
    @Override
    public int getItemViewType(int position) {
        Item item = items.get(position);
        if (item.isSection())
            return TYPE_SECTION;

        return TYPE_OBIEKT;
    }

    /**
     * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // Get the item
        final Item item = items.get(position);

        if (getItemViewType(position) == TYPE_SECTION) {

            // Return a SectionView object
            return getSectionView(position, convertView, parent, (SectionItem) item);
        }

        // Return an Obiekt object
        return getObiektView(position, convertView, parent, (Obiekt) item);
    }

    /**
     * SectionView specific
     * 
     * @param position
     * @param convertView
     * @param parent
     * @param item
     * @return
     */
    public View getSectionView(int position, View convertView, ViewGroup parent, SectionItem item) {

        SectionHolder holder;
        if(convertView == null){

            holder = new SectionHolder();

            // Inflate a new View
            convertView = vi.inflate(R.layout.list_item_section, null);
            holder.sectionView = (TextView) convertView.findViewById(R.id.list_item_section_text);

            // Set the ObiektHolder as the tag, to retrieve it for re-using
            convertView.setTag(holder);

        } else {
            holder = (SectionHolder) convertView.getTag();
        }

        // Holder is never null here
        holder.sectionView.setText(item.getSectionTitle());

        return convertView;

    }

    public View getObiektView(int position, View convertView, ViewGroup parent, Obiekt item) {

        ObiektHolder holder;
        if(convertView == null){

            holder = new ObiektHolder();

            // Inflate a new View
            convertView = vi.inflate(R.layout.row_list, null);
            holder.title = (TextView)convertView.findViewById(R.id.row_tytul);
            holder.odleglosc = (TextView)convertView.findViewById(R.id.row_odleglosc);
            holder.obrazek = (ImageView)convertView.findViewById(R.id.row_ikona_mala);
            holder.pole = (LinearLayout)convertView.findViewById(R.id.LinearLayout1);

            // Set the ObiektHolder as the tag, to retrieve it for re-using
            convertView.setTag(holder);

        } else {
            holder = (ObiektHolder) convertView.getTag();
        }

        // Holder is never null here
        holder.title.setText(item.getObiektTitle());

        return convertView;
    }

    private static class SectionHolder {
        TextView    sectionView;
    }

    private static class ObiektHolder {
        TextView        title;
        TextView        odleglosc;
        ImageView       obrazek;
        LinearLayout    pole;
    }
}

注意:经过测试,现在可以工作!

NOTE: Tested and working now!

这篇关于Android SecionList和Holder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆