关于listView的史上最奇怪的问题

今天在公司碰到的问题,伤透了我的脑筋。

在我的Acitivity中有两个fragment(f1和f2),两个fragment布局很类似,但是也有不同,使用的是不同的初始化代码。每个fragment中都有ListView,每一个ListView都增加了一个footerView,然后在我的smartisan t1上两个ListView尾部都显示正常,在魅族mx3,以及vivo的一款手机上f2显示不了footerview。没有任何异常报错信息,对调两个fragment的显示位置,发现依旧是该fragment上的该ListView的footer无法显示,另一个依然正常。


f1使用以下代码初始化的

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(findLayoutId(), null);
        mListView = (ListView) view.findViewById(R.id.lv_list);
        if (mListView == null) {
            throw new IllegalArgumentException("can not find R.id.lv_list.");
        }
        mTipsLayout = (TipsLayout) view.findViewById(R.id.custom_tipslayout);
        if (mTipsLayout == null) {
            throw new IllegalArgumentException("can not find R.id.custom_tipslayout.");
        }
        mListView.setOnScrollListener(this);
        mListView.setOnItemClickListener(this);
        mFooterView = getFooterView();
        if (mFooterView == null) {
            mFooterView = inflater.inflate(R.layout.game_view_footer_loading, null);
            mFooterView.findViewById(R.id.custom_loading_view).setVisibility(View.GONE);
            mFooterView.findViewById(R.id.tv_loading_tips).setOnClickListener(
                    new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (getView().findViewById(R.id.custom_loading_view).getVisibility() == View.VISIBLE) {
                                return;
                            }
                            if (mHasLoadAllData) {
                                return;
                            }
                            sendEmptyBackgroundMessage(MSG_BACK_LOAD_DATA);
                        }
                    });
        }
        mListView.addFooterView(mFooterView);

        mAdapter = createAdapter();
        mListView.setAdapter(mAdapter);
        mTipsLayout.setOnRefreshButtonClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                sendEmptyBackgroundMessage(MSG_BACK_LOAD_DATA);
            }
        });
        if (!mDelayLoad) {
            sendEmptyBackgroundMessage(MSG_BACK_LOAD_DATA);
        }
        // 非ViewPager时因为不会调用 setUserVisibleHint,所以要在这设定
        if (!mHaveSetUserVisibleHint) {
            setDobuleClickCallback();
        }

        return view;
    }

f2使用以下代码初始化的:

<pre name="code" class="java">@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(findLayoutId(), null);
        mListView = (ListView) view.findViewById(R.id.lv_list);
        if (mListView == null) {
            throw new IllegalArgumentException("can not find R.id.lv_list.");
        }
	mAdapter = createAdapter();
        mListView.setAdapter(mAdapter);
        mListView.setOnScrollListener(this);
        mTipsLayout = (TipsLayout) view.findViewById(R.id.custom_tipslayout);
        if (mTipsLayout == null) {
            throw new IllegalArgumentException("can not find R.id.custom_tipslayout.");
        }
        mFooterView = getFooterView(inflater);
        if (mFooterView == null) {
            throw new IllegalArgumentException("footer view can not be null");
        }
        mListView.addFooterView(mFooterView);
        mTipsLayout.setOnRefreshButtonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendEmptyBackgroundMessage(MSG_BACK_LOAD_DATA);
            }
        });
        if (!mDelayLoad) {
            sendEmptyBackgroundMessage(MSG_BACK_LOAD_DATA);
        }
        addHeaderView(mListView);
        // 非ViewPager时因为不会调用 setUserVisibleHint,所以要在这设定
        if (!mHaveSetUserVisibleHint) {
            setDobuleClickCallback();
        }
        return view;
    }



经过几个小时对代码的仔细对照,推敲后,问题终于浮出水面。
结论:
在给ListView设置footerView的代码,要放在setAdapter之前,在部分手机的部分情况下(具体场景我也没推敲出来)如果将addFooterView放在setAdapter后,尽管你调用了
notifyDataSetChanged但是并不能够让ListView加载出这个footerView
 
 

你可能感兴趣的:(ListView,addFooterView)