ExpandableListView改变了getCount()但不是视觉上

时间:2016-02-12 05:29:35

标签: android listview expandablelistview

我有一个第一次加载良好的ExpandableListView,但是在更改了适配器值并且调用了notifyDataSetChanged后(我甚至尝试再次设置适配器),屏幕上的ExpandableListView保持不变...但是getCount()确实发生了变化。在发布代码之前,让我解释一下我的意图以及到目前为止我尝试过的内容。我想在显示ViewPager中的第2页时生成适配器变量的数据,然后在同一片段内的ExpandableListView中显示它。我设法以几种不同的方式做到这一点,但总有一个问题让我寻找替代方案。

首先,我使用addOnPageChangeListener而不是SimpleOnPageChangeListener在ViewPager的默认类MainActivity中完成了所有这些操作,并使与ExpandableListView相关的变量成为静态,因此我可以从MainActivity设置适配器。每次显示特定页面时都会完美地生成数据,但是存在一个问题:ExpandableListView没有显示任何内容,即使所有涉及的变量都具有正确的值并且设置了适配器。

所以我采取了另一条道路......我将ViewPager设为静态,将侦听器放在第2页片段类中,并从那里生成数据+设置适配器,除了ViewPager之外没有涉及静态变量。这对于第一次向页面滑动,数据生成并成功显示完美无瑕,但在随后的页面滑动中发生了一些奇怪的事情:侦听器内部的代码每次调用x次,x是用户的次数已经刷到片段。这意味着它第一次调用代码一次(好),然后再调用两次,依此类推......这显然会弄乱一切。我测试过,当侦听器在MainActivity中时,这不会发生,每次只调用一次代码(但ExpandableListView没有显示任何内容)。在这个阶段,第一次滑动是完美的,但第二次也提供了预期的结果,更新ExpandableListView和除了必要之外的所有工作(因为运行代码一次),然后在第三次滑动我得到一个NullPointerException(没有惊喜给定金额弄乱它确实。)

此时我非常沮丧,似乎每次我使用静态变量它都无法正常工作:首先使用ExpandableListView相关变量来设置MainActivity的适配器,然后使ViewPager静态并使用监听器从它来运行另一个类中的方法。

下一步是读取addOnPageChangeListener的替代品以查看是否有效,就在我遇到SimpleOnPageChangeListener时。我很高兴,它工作了...它只运行代码一次,每次滑动到页面,同时也在ExpandableListView中显示结果,但是,问题...即使它的数据更改成功也不会更新它(当前阶段) )。

所以我对编程很新,并且不知道这里发生了什么...如果是我发现了一堆bug,那些东西搞砸了我安装的SDK或者是我还缺少一些东西。请帮忙。

我当前阶段的简化版本:

import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ResultsFragment extends android.support.v4.app.Fragment  {

    ExpandableListView resultsELV;
    HashMap<Header,List<String>> resultsHash = new HashMap<Header, List<String>>();
    List<Header> resultsTitles = new ArrayList<>();
    ResultsAdapter resultsAdapter;

    View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_results, container, false);
        resultsELV = (ExpandableListView)rootView.findViewById(R.id.expandableListVieww);

        ViewPager.SimpleOnPageChangeListener listener = new 

ViewPager.SimpleOnPageChangeListener(){
            @Override
            public void onPageSelected(int position) {

                if (position == 1) {

                    getResults();

                }
            }
        };

        MainActivity.mViewPager.setOnPageChangeListener(listener);

        return rootView;    }

    public void getResults() {

        // resultsHash & resultsTitles get filled

        Toast.makeText(resultsELV.getContext(),resultsHash.size()+" 

"+resultsTitles,Toast.LENGTH_SHORT).show();
        resultsAdapter=new ResultsAdapter(resultsELV.getContext(),resultsHash,resultsTitles);
        resultsELV.setAdapter(resultsAdapter);

    }
}

0 个答案:

没有答案