Im建立一個列表視圖與部分。我正在使用this回覆的帖子,之前問過一個問題,但我再次卡住了。我認爲這是一個非常奇怪的錯誤。列表視圖和ViewHolder(s)和部分滾動時失敗
當我開始我的活動時,我可以看到屏幕上的列表,就像我想要的一樣。但是當我嘗試開始滾動活動崩潰時。我以爲我以同樣的方式實施了一切,但顯然我不是。 我的適配器:
public class DelftAdapter extends BaseAdapter {
private static final int TYPE_ITEM = 0;
private static final int TYPE_SECTION = 1;
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;
}
@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
}
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
View vi=convertView;
final ListItem li = listItems.get(position);
ItemViewHolder itemHolder;
SectionViewHolder sectionHolder;
switch (type) {
case TYPE_SECTION: // is sectionheader
if (vi == null) { //convertview==null
sectionHolder = new SectionViewHolder();
vi = inflater.inflate(R.layout.sectionedlistitem, null);
vi.setOnClickListener(null);
vi.setOnLongClickListener(null);
vi.setLongClickable(false);
sectionHolder.title = (TextView) vi.findViewById(R.id.list_header_title);
}else{//convertview is not null
sectionHolder = (SectionViewHolder)vi.getTag();
}
SectionItem si = (SectionItem)li;
sectionHolder.title.setText(si.getTitle());
break;
case TYPE_ITEM:// no sectionheader
if (vi == null) { //convertview==null
itemHolder = new ItemViewHolder();
vi = inflater.inflate(R.layout.singlelistitem, null);
itemHolder.name=(TextView)vi.findViewById(R.id.tvname);
itemHolder.tip=(TextView)vi.findViewById(R.id.tvtip);
itemHolder.image=(ImageView)vi.findViewById(R.id.image);
}else{ // convertview != null
itemHolder = (ItemViewHolder)vi.getTag();
}
ListData ld = (ListData)li;
itemHolder.name.setText(ld.name);
itemHolder.tip.setText(ld.tip);
if (ld.photoUrl != null){
imageLoader.DisplayImage(ld.photoUrl, itemHolder.image);
}else{
itemHolder.image.setImageURI(Uri.fromFile(new File("//assets/nopic.png")));
}
// alternating colors
int colorPos = position % bgColors.length;
vi.setBackgroundResource(bgColors[colorPos]);
break;
}
return vi;
}
public static class SectionViewHolder {
public TextView title;
}
public static class ItemViewHolder {
public TextView name;
public TextView tip;
public ImageView image;
}
}
我建造兩艘ViewHolders了兩種不同的觀點。發生的錯誤是itemHolder.name.setText(ld.name);
行上的NullPointerException。 我沒有得到的東西是,代碼適用於前幾個entrys,但失敗時,我開始滾動。在我使用的數據中,名稱和提示永遠不會爲空,只有photoUrl可能會被代碼覆蓋。
任何人都知道爲什麼這段代碼失敗?
很好,我加了vi.setTag(sectionHolder);和vi.setTag(itemHolder);現在它工作。謝謝。 – Jasper 2012-07-24 07:02:22