我使用ViewHolder模式进行快速滚动,但我的代码到目前为止还没有运气:
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
ListItem item = getItem(position);
if(rowView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
ViewHolder viewHolder = new ViewHolder();
if(item.isSectionHeader()) {
rowView = inflater.inflate(R.layout.section_header, null);
viewHolder.header = (TextView)rowView.findViewById(R.id.section_header);
} else {
rowView = inflater.inflate(R.layout.list_row_coupon, null);
viewHolder.image = (NetworkImageView)rowView.findViewById(R.id.thumbnail);
}
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
if (imageLoader == null)
imageLoader = ApplicationController.getInstance().getImageLoader();
holder.image.setImageUrl(cell.getThumbnailUrl(), imageLoader);
holder.header.setText(cell.getShortDescription());
return rowView;
}
但它会崩溃相同的代码而不管条件是否有任何想法?
11-12 13:30:21.500: E/AndroidRuntime(18745): FATAL EXCEPTION: main
11-12 13:30:21.500: E/AndroidRuntime(18745): Process: com, PID: 18745
11-12 13:30:21.500: E/AndroidRuntime(18745): java.lang.NullPointerException
11-12 13:30:21.500: E/AndroidRuntime(18745): at ListAdapter.getView(ListAdapter.java:128)
11-12 13:30:21.500: E/AndroidRuntime(18745): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
11-12 13:30:21.500: E/AndroidRuntime(18745): at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
11-12 13:30:21.500: E/AndroidRuntime(18745): at android.widget.ListView.onMeasure(ListView.java:1175)
11-12 13:30:21.500: E/AndroidRuntime(18745): at android.view.View.measure(View.java:16497)
继承了我的logcat的一部分
答案 0 :(得分:0)
convertView
只有一次为空。因此,ViewHolder
将使用item.isSectionHeader()
或其他情况初始化一次,使TextView和ImageView之间的一个始终为null。现在你必须选择:
Initialize
ImageView
和TextView,之后检查类型,并根据条件隐藏前者或后者getViewTypeCount
和getItemViewType
以获得更多的空convertView
答案 1 :(得分:0)
问题出在这里
if (imageLoader == null)
imageLoader = ApplicationController.getInstance().getImageLoader();
holder.image.setImageUrl(cell.getThumbnailUrl(), imageLoader);
holder.header.setText(cell.getShortDescription());
您不知道getView调用的位置。 只有当项目不是部分标题时,才会初始化您的imageview。因此,您必须在图像视图上设置任何内容之前进行检查。 如果该项是节标题,请不要使用imageView。
答案 2 :(得分:0)
问题是,只有当条件viewHolder.header
为item.isSectionHeader()
且true
仅在条件viewHolder.image
为item.isSectionHeader()
时才会初始化false
但是在设置图像和设置文本时,您没有检查条件。
只需添加如下条件。
if(item.isSectionHeader()) {
holder.header.setText(cell.getShortDescription());
} else {
holder.image.setImageUrl(cell.getThumbnailUrl(), imageLoader);
}