Java делает настройку корпуса переключателя короче - PullRequest
0 голосов
/ 03 июля 2018

У меня есть switch case statement в моем FragmentStatePagerAdapter. И я рассмотрел много похожих вопросов, но ни один из них не дал более короткого ответа, то есть случаи switch все еще находятся в их коде.

Этот код действительно повторяющийся и уродливый на вид. Есть ли способ сделать этот вид короче?

@Override
public SongListFragment getItem(int position) {
    SongListFragment slf = new SongListFragment();
    switch (position) {
        case 0:
            slf.setAudioList(getAudioList(tabTitles[0]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 1:
            slf.setAudioList(getAudioList(tabTitles[1]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 2:
            slf.setAudioList(getAudioList(tabTitles[2]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 3:
            slf.setAudioList(getAudioList(tabTitles[3]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        case 4:
            slf.setAudioList(getAudioList(tabTitles[4]));
            slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
                @Override
                public void onClick(Audio audio) {
                    itemListener.onClick(audio);
                }
            });
            return slf;
        default:
            return null;
    }
}

Ответы [ 4 ]

0 голосов
/ 03 июля 2018
@Override
public SongListFragment getItem(int position) {
    // don't need to initialize
    SongListFragment slf = null;
    // The position is 0 to 4, returns null when position is over tabTiles.length() 
    if (position >= 0 && position <= 4 
        && position < tabTiles.length()) {
        slf = new SongListFragment();
        slf.setAudioList(getAudioList(tabTitles[position]));
        slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
            @Override
            public void onClick(Audio audio) {
                itemListener.onClick(audio);
            }
        });
    }
    // returns SongListFragment if it is null or not
    return slf;
}
0 голосов
/ 03 июля 2018

Здесь:

  @Override
public SongListFragment getItem(int position) {
    switch (position) {
        case 0:
            return yourMethod(0);
        case 1:
            return yourMethod(1);
        case 2:
            return yourMethod(2);
        case 3:
            return yourMethod(3);
        case 4:
            return yourMethod(4);
        default:
            return null;
    }
}

private Object yourMethod(int i) {
    SongListFragment slf = new SongListFragment();
    slf.setAudioList(getAudioList(tabTitles[i]));
    slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
        @Override
        public void onClick(Audio audio) {
            itemListener.onClick(audio);
        }
    });
    return slf;
}
0 голосов
/ 03 июля 2018

Ответ Лино с простой проверкой границ, как предложено @SMA.

@Override
public SongListFragment getItem(int position) {
     if ( position < 0 || position >= tabTiles.length() ){
       //your previous default case
       return null;
     }else{
       SongListFragment slf = new SongListFragment();
       slf.setAudioList(getAudioList(tabTitles[position]));
       slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
         @Override
         public void onClick(Audio audio) {
              itemListener.onClick(audio);
            }
          });
     return slf;
   }
}
0 голосов
/ 03 июля 2018

Поскольку каждый корпус переключателя имеет практически одинаковое тело, только индекс / позиция различны. Во-первых, вы можете полностью избавиться от корпуса переключателя:

@Override
public SongListFragment getItem(int position) {
     SongListFragment slf = new SongListFragment();
     slf.setAudioList(getAudioList(tabTitles[position]));
     slf.setItemOnClickListener(new SongListFragment.SongListItemOnClickListener() {
        @Override
        public void onClick(Audio audio) {
            itemListener.onClick(audio);
        }
     });
     return slf;
}
...