Android SecionList和Holder [英] Android SecionList and 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屋!