做一个简单的音乐播放器,使用ViewPager侧滑页做。每个侧滑页的内容都是一个单独的Fragment类对象,其中音乐列表是一个自定义的MusicFragment。
然后音乐列表碎片中使用了ExpandaleListView控件,读取SD卡的所有音乐列表并且按字母排序显示了。
问题:在界面的侧滑切换操作中,每次侧滑都会进入到ExpandaleListView的适配器MusicAdapter(自定义继承自BaseExpandableListAdapter)的getChildView方法中。
断点调试发现MusicFragment碎片从运行APP开始只执行一次。并且搜索整个工程只有此碎片代码中使用了MusicAdapter。
附上碎片代码
public class FragmentMusic extends Fragment { // private LayoutInflater inflater; //音乐分组控件 private ExpandableListView elvMusic; //拼音排序控件 private AssortView assortView; private View mainView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // this.inflater=inflater; mainView=inflater.inflate(R.layout.frag_music, null); elvMusic=(ExpandableListView) mainView.findViewById(R.id.elvMusic); assortView=(AssortView) mainView.findViewById(R.id.assortView1); //查询所有音乐列表 final List<MusicGroup> musicList = MusicController.getLocalMusicList2(this.getActivity()); final MusicGroupAdapter musicAdapter=new MusicGroupAdapter(this.getActivity(),musicList); elvMusic.setAdapter(musicAdapter); //展开所有分组 int count = elvMusic.getCount(); for (int i = 0; i < count; i++) { elvMusic.expandGroup(i); } elvMusic.setOnChildClickListener(new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Music music = musicList.get(groupPosition).getMusicList().get(childPosition); //更新播放歌曲位置 MusicPosition currPosition=new MusicPosition(); currPosition.currentGroupPos=groupPosition; currPosition.currentMusicPos=childPosition; MusicController.currentPos=currPosition; OnFragPlayListener fragPlayListener=(OnFragPlayListener)getActivity(); if(fragPlayListener!=null){ fragPlayListener.playMusic(music); } return true; } }); View letterView=inflater.inflate(R.layout.letter_dialog, null); final TextView tvLetter =(TextView) letterView.findViewById(R.id.tvLetter); //弹出对话框 final PopupWindow popWin=new PopupWindow(letterView,150,150); assortView.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(String item) { tvLetter.setText(item); popWin.showAtLocation(mainView,//显示在哪个控件的上面 Gravity.CENTER, 0, //偏移量 0);//偏移量 //联动ExpandableListView对应的分组 int count = musicAdapter.getGroupCount(); for (int i = 0; i < count; i++) { //如果选择的分组名称相等 则选中分组 if(musicList.get(i).getGroupName().equals(item)){ elvMusic.setSelectedGroup(i); } } } @Override public void onItemRealase() { if(popWin!=null){ //释放弹出窗口 popWin.dismiss(); } } }); return mainView; } public interface OnFragPlayListener{ public void playMusic(Music music); } }
请问:getChildView方法到底是什么时候执行啊?为什么我侧滑页面会进入到碎片里面的高级控件的适配器里面去?我肯定没有滚动音乐列表控件。
可以通过viewpager的setOffscreenPageLimit设置预加载,防止每次切换都重新加载
查了很多资料都没发现类似的问题。理论上应该是只有刷新列表和滚动列表的时候才调用getChildView方法。
后来自己又重写写了一个,一模一样的思路没有问题。同事一样的代码也没问题。估计是某个什么细节没注意吧。哎~