可扩展列表视图持有者变为空



这是我的getChildView

public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {
    View v = convertView;
    ViewHolderChild h;
    if (v == null) {
        h = new ViewHolderChild();
        switch (groupPosition) {
        case GROUP_OVERVIEW:
            v = inflater
                    .inflate(R.layout.adapter_show_child_overview, null);
            h.wv_overview = (WebView) v
                    .findViewById(R.id.wv_adapter_show_child_overview);
            h.tv_title = (TextView) v
                    .findViewById(R.id.tv_adapter_show_overview_title);
            h.tv_date = (TextView) v
                    .findViewById(R.id.tv_adapter_show_overview_date);
            h.tv_year = (TextView) v
                    .findViewById(R.id.tv_adapter_show_overview_year);
            h.tv_network = (TextView) v
                    .findViewById(R.id.tv_adapter_show_overview_network);
            h.tv_title.setTypeface(font_bold);
            h.tv_date.setTypeface(font_thin);
            h.tv_year.setTypeface(font_thin);
            h.tv_network.setTypeface(font_bold);
            v.setTag(h);
            break;
        case GROUP_SEASONS:
            v = inflater.inflate(R.layout.adapter_shows_child_seasons, null);
            h.siv = (SmartImageView) v.findViewById(R.id.siv_adapter_show_child_seasons);
            h.tv_seasons = (TextView) v.findViewById(R.id.tv_adapter_show_child_seasons);
            v.setTag(h);
            break;
        }

    } else {
        h = (ViewHolderChild) v.getTag();
    }
    switch (groupPosition) {
    case GROUP_OVERVIEW:
        OverView overview = groups.get(groupPosition).getOverview();
        FunctionUtils.loadHtml(h.wv_overview, overview.getOverview(),
                FunctionUtils.FONT_ROBOTO_THIN, 14);
        h.tv_date.setText("" + overview.getAirDay() + "/"
                + overview.getAirTime());
        h.tv_title.setText(overview.getTitle());
        h.tv_year.setText("" + overview.getYear());
        h.tv_network.setText("" + overview.getNetwork());
        break;
    case GROUP_SEASONS:
        SeasonObject season = groups.get(groupPosition).getSeasons().get(childPosition);
        if(season.getImages().getPoster() != null){
            h.siv.setImageUrl(season.getImages().getPoster());
        }
        h.tv_seasons.setText("Season : "+season.getSeason()+" Episode : "+season.getEpisodes());
        break;
    }
    return v;
}

但是当我开始向下滚动时,这一行存在一个问题:h.siv.setImageUrl(season.getImages().getPoster());

我看到了日志,它说 h 包含来自 GROUP_OVERVIEW 的所有视图,而不是GROUP_SEASONS

它会导致NullPointerException, ExpandableListConnector getView

这是日志猫:

02-13 22:42:11.952: E/AndroidRuntime(7832): FATAL EXCEPTION: main
02-13 22:42:11.952: E/AndroidRuntime(7832): java.lang.NullPointerException
02-13 22:42:11.952: E/AndroidRuntime(7832):     at com.galite.pomo.adapters.ShowAdapter.getChildView(ShowAdapter.java:117)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:451)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.AbsListView.obtainView(AbsListView.java:2161)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.ListView.makeAndAddView(ListView.java:1840)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.ListView.fillDown(ListView.java:675)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.ListView.fillGap(ListView.java:639)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4970)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3126)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3400)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.View.dispatchTouchEvent(View.java:7384)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2203)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1938)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2209)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1952)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.View.dispatchPointerEvent(View.java:7564)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5472)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5512)
02-13 22:42:11.952: E/AndroidRuntime(7832):     at android.view.Ch

由于您使用组的子项的两种类型的视图。所以你必须覆盖以下两种方法

final int CHILDVIEW_TYPE_COUNT = 2;
@Override
public int getChildTypeCount() {
    return CHILDVIEW_TYPE_COUNT;
}

从您的代码中,两种类型的视图由您的组标记,假设您只有两个组。

@Override
public int getChildType(int groupPosition, int childPosition)
{
    return groupPosition;
}

最新更新