【问题标题】:Listview with or without convertview == nullListview 有或没有 convertview == null
【发布时间】:2012-07-23 14:58:11
【问题描述】:

我在使用

时遇到了难题
if (convertview==null){
(my code)
}

或者不。如果没有这段代码,我的列表视图不是很快,它有时会锁定几毫秒,你可以很容易地注意到这一点在使用中。它只是无法正常工作。

但是当这段代码时,我的列表项将在一段时间(10 左右)后开始重新计算,并且我的列表中有一些返回的列表项(我使用了标题)。我使用本教程获取包含link 部分的列表视图。列表的长度很好。

当然,我的列表对于重复项目的视图完全没用(顺便说一句很好地划分了),但我也不希望它变慢。 有谁知道该怎么做? 下面是我的适配器:

公共类 DelftAdapter 扩展 BaseAdapter {

private Activity activity;
private  List<ListItem> listItems;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader; 
private final int[] bgColors = new int[] { R.color.list_odd, R.color.list_even };


public DelftAdapter(Activity a, ArrayList<ListItem> li) {
    activity = a;
    listItems = li;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    imageLoader=new ImageLoader(activity.getApplicationContext());

}

public int getCount() {
    return listItems.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}




public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;


        final ListItem li = listItems.get(position); 
        if (li != null) {
            if(li.isSection()){ // is sectionheader
                SectionItem si = (SectionItem)li; 
                vi = inflater.inflate(R.layout.sectionedlistitem, null);
                vi.setOnClickListener(null);
                vi.setOnLongClickListener(null);
                vi.setLongClickable(false);
                final TextView sectionView = (TextView) vi.findViewById(R.id.list_header_title);
                sectionView.setText(si.getTitle());
            }else{ // no sectionheader
                ListData ld = (ListData)li;
            vi = inflater.inflate(R.layout.singlelistitem, null);
        TextView tvNames=(TextView)vi.findViewById(R.id.tvname); 
        TextView tvTip=(TextView)vi.findViewById(R.id.tvtip);
        ImageView image=(ImageView)vi.findViewById(R.id.image);
        tvNames.setText(ld.name);
        tvTip.setText(ld.tip);
            if (listItems.get(position) != null ){
                imageLoader.DisplayImage(ld.photoUrl, image);
                }
                else{
                image.setImageURI(Uri.fromFile(new File("//assets/eten.png")));
            }
        // alternating colors
        int colorPos = position % bgColors.length;
             vi.setBackgroundResource(bgColors[colorPos]);
            }
    }
        return vi;

}
}

【问题讨论】:

    标签: android performance listview convertview


    【解决方案1】:

    考虑将getItemViewType()getViewTypeCount() 与回收convertView 一起使用。当您有具有各种布局的列表项时使用这些。你绝对应该回收convertView

    另见http://android.amberfog.com/?p=296

    在你的情况下:

        private static final int TYPE_ITEM = 0;
        private static final int TYPE_SECTION = 1;
    
        @Override
        public int getItemViewType(int position) {
            return listItems.get(position).isSection() ? TYPE_SECTION : TYPE_ITEM
        }
    
        @Override
        public int getViewTypeCount() {
            return 2;  // sectionheader and regular item
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            int type = getItemViewType(position);
            if (convertView == null) {
                switch (type) {
                    case TYPE_ITEM:
                        convertView = mInflater.inflate(R.layout.singlelistitem, null);
                        ...
                        break;
                    case TYPE_SECTION:
                        convertView = mInflater.inflate(R.layout.sectionedlistitem, null);
                        ...
                        break;
                }
            } else {
                ...
            }
            return convertView;
        }
    

    也可以使用ViewHolder 模式来获得更好的性能。

    【讨论】:

    • 我专门使用这个和 ViewHolder 模式,它可能是样板代码,但它确实有助于提高性能。
    • 我已经成功了!但是现在我在按照建议实现 ViewHolder 模式时遇到了困难,但非常感谢。
    • 嗨,我在使用带有部分的 ListViews 时也遇到了问题。这是我的两个布局:
    猜你喜欢
    • 2016-01-14
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多