具有多个布局的ViewHolder模式

时间:2014-11-12 11:27:54

标签: java android listview android-arrayadapter

我使用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的一部分

3 个答案:

答案 0 :(得分:0)

convertView只有一次为空。因此,ViewHolder将使用item.isSectionHeader()或其他情况初始化一次,使TextView和ImageView之间的一个始终为null。现在你必须选择:

    当convertView为null时,
  • Initialize ImageView和TextView,之后检查类型,并根据条件隐藏前者或后者
  • 或者,您可以覆盖getViewTypeCountgetItemViewType以获得更多的空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.headeritem.isSectionHeader()true仅在条件viewHolder.imageitem.isSectionHeader()时才会初始化false

但是在设置图像和设置文本时,您没有检查条件。

只需添加如下条件。

if(item.isSectionHeader()) {
    holder.header.setText(cell.getShortDescription());
} else {
    holder.image.setImageUrl(cell.getThumbnailUrl(), imageLoader);
}