我遇到了一些BaseAdapter代碼的問題,這些代碼是我從一本書改編而來的。我一直在我的應用程序的各處使用這些代碼的變體,但只有在滾動長列表時才意識到ListView中的項目變得混亂,而不是顯示所有元素。BaseAdapter導致ListView在滾動時出現故障
描述確切的行爲非常困難,但是很容易看出您是否將50個項目排序並開始滾動上下滾動。
class ContactAdapter extends BaseAdapter {
ArrayList<Contact> mContacts;
public ContactAdapter(ArrayList<Contact> contacts) {
mContacts = contacts;
}
@Override
public int getCount() {
return mContacts.size();
}
@Override
public Object getItem(int position) {
return mContacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
LayoutInflater li = getLayoutInflater();
view = li.inflate(R.layout.groups_item, null);
TextView label = (TextView)view.findViewById(R.id.groups_item_title);
label.setText(mContacts.get(position).getName());
label = (TextView)view.findViewById(R.id.groups_item_subtitle);
label.setText(mContacts.get(position).getNumber());
}
else
{
view = convertView;
}
return view;
}
}
哦另一個很好的例子,我明白了。那麼ListView最多隻包含填充屏幕所需的視圖數量? – 2010-06-25 22:58:21
@Mr。不明確:或多或少。它可以緩存一對能夠快速響應滾動請求。但是,在一個帶有10行UI空間和1000行「適配器」的ListView中,「視圖」的數量將會比1,000更接近10。大概就像12或14一樣。這是'convertView'行回收的重點,所以Android不必創建(以及後來的GC)一堆行部件。 – CommonsWare 2010-06-25 23:31:52