我有一个第一次加载良好的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);
}
}