首页 新闻 会员 周边

安卓BaseExpandableListAdapter的getChildView()方法执行问题

0
悬赏园豆:20 [已解决问题] 解决于 2018-10-29 15:00

做一个简单的音乐播放器,使用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方法到底是什么时候执行啊?为什么我侧滑页面会进入到碎片里面的高级控件的适配器里面去?我肯定没有滚动音乐列表控件。

Mr.xiong的主页 Mr.xiong | 初学一级 | 园豆:79
提问于:2017-10-20 17:29
< >
分享
最佳答案
0

可以通过viewpager的setOffscreenPageLimit设置预加载,防止每次切换都重新加载

收获园豆:20
凯凯安卓开发 | 菜鸟二级 |园豆:208 | 2017-10-26 10:47
其他回答(1)
0

查了很多资料都没发现类似的问题。理论上应该是只有刷新列表和滚动列表的时候才调用getChildView方法。

后来自己又重写写了一个,一模一样的思路没有问题。同事一样的代码也没问题。估计是某个什么细节没注意吧。哎~

Mr.xiong | 园豆:79 (初学一级) | 2017-10-27 21:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册