0

我個人發現它更易於使用和閱讀切換案例場景。有誰知道我的列表視圖的代碼可以更改爲什麼,以便它在字符串上使用switch語句而不是if語句?我已經根據需要將編譯器更改爲1.7。將字符串語句轉換爲切換字符串語句

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     View v = getView(); 

     if (getActivity().findViewById(R.id.detail_container) != null) { 
      mTwoPane = true; 
     } else { 
      mTwoPane = false; 
     } 

     ListView lv = (ListView)v.findViewById(android.R.id.list); 
     lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 



@Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       // get the adapter, then get the name from the adapter at that position 
     WorldListAdapter adapter = (WorldListAdapter) parent.getAdapter(); 
     String country = adapter.getItem(position); 

       if (mTwoPane) { 
      setItemNormal(); 
      View rowView = view; 
      setItemSelected(rowView); 

      Fragment newFragment; 
      if (country.equals(view.getResources().getString(R.string.africa))) { 
       newFragment = new FragmentAfrica(); 
      } else if (country.equals(view.getResources().getString(R.string.asia))) { 
       newFragment = new FragmentAsia(); 
      } else if (country.equals(view.getResources().getString(R.string.europe))) { 
       newFragment = new FragmentEurope(); 
      } else { 
       newFragment = new FragmentAfrica(); 
      } 
      WorldActivity activity = (WorldActivity) view.getContext(); 
      FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.detail_container, newFragment); 
      transaction.commit(); 
     } else { 
      Intent intent; 
      if (country.equals(view.getResources().getString(R.string.africa))) { 
       intent = new Intent(getActivity(), AfricaActivity.class); 
      } else if (country.equals(view.getResources().getString(R.string.asia))) { 
       intent = new Intent(getActivity(), AsiaActivity.class); 
      } else if (country.equals(view.getResources().getString(R.string.europe))) { 
       intent = new Intent(getActivity(), EuropeActivity.class); 
      } else { 
       intent = new Intent(getActivity(), AfricaActivity.class); 
      } 
      startActivity(intent); 
     } 
    } 

      public void setItemSelected(View view) { 
       View rowView = view; 
       view.setBackgroundColor(Color.parseColor("#1C3F96")); 

       TextView tv0 = (TextView) rowView.findViewById(R.id.country); 
       tv0.setTextColor(Color.parseColor("#FFFFFF")); 

       TextView tv1 = (TextView) rowView.findViewById(R.id.country_description); 
       tv1.setTextColor(Color.parseColor("#FFFFFF")); 
      } 

      public void setItemNormal() { 
       for (int i = 0; i < getListView().getChildCount(); i++) { 
        View v = getListView().getChildAt(i); 
        v.setBackgroundColor(Color.TRANSPARENT); 

        TextView tv0 = ((TextView) v.findViewById(R.id.country)); 
        tv0.setTextColor(Color.WHITE); 

        TextView tv1 = ((TextView) v.findViewById(R.id.country_description)); 
        tv1.setTextColor(Color.parseColor("#B5B5B5")); 
       } 
      } 
     }); 

     super.onActivityCreated(savedInstanceState); 
    } 
+0

我認爲這個問題屬於代碼審查 –

+1

如果'switch'語句不是最好的解決方案? –

+0

我會建議在多個級別分支,因爲在你的例子中處理每個獨立的if/else部分集合的方法(不是將它們全部組合到複雜的switch語句中)...更好地處理...另外,可以和更喜歡工廠模式 – Constantin

回答

1

創建和使用工廠方法,而不是..

Fragment newFragment = FragmentFactory.createInstance(country, view); 
...    
Intent intent = IntentFactory.createInstance(country, view); 

這樣,您就可以在你的工廠類添加新類型的片段和意圖,但留在客戶端類通用的類型。這是更容易維護和擴展這樣

考慮這個職位另一個就這一話題Simple Factory vs Factory Method: Switch statement in factory vs. client

這裏是你的情況可能廠例子

public class FragmentFactory { 

    public static Fragment getInstance(String country, View view) { 
     Fragment newFragment = null; 

     if (country.equals(view.getResources().getString(R.string.africa))) { 
      newFragment = new FragmentAfrica(); 
     } 
     else if (country.equals(view.getResources().getString(R.string.asia))) { 
      newFragment = new FragmentAsia(); 
     } 
     else { 
      if (country.equals(view.getResources().getString(R.string.europe))) { 
       newFragment = new FragmentEurope(); 
      } 
     } 
     return newFragment;  
    } 
} 

,您可以嘗試作爲開關

public static Fragment getInstance(String country, View view,) { 
    Fragment newFragment = null; 

    switch (country.toLowerCase()) { 

     case view.getResources().getString("africa"): 
      newFragment = new FragmentAfrica(); 
      break; 

     case view.getResources().getString("asia"): 
      newFragment = new FragmentAsia(); 
      break; 

     case view.getResources().getString("europe"): 
      newFragment = new FragmentEurope(); 
      break; 
    }    
    return newFragment; 
} 
+0

你可以編輯回答也顯示字符串資源的開關案例senarios嗎? – MacaronLover

+0

爲什麼?其他人已經在另一個答案 – Constantin

+0

已經這樣做因爲我想看看你會怎麼做。 – MacaronLover

2

的java 8支持切換的情況下與String

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // get the adapter, then get the name from the adapter at that position 
    WorldListAdapter adapter = (WorldListAdapter) parent.getAdapter(); 
    String country = adapter.getItem(position); 

    if (mTwoPane) { 
     setItemNormal(); 
     View rowView = view; 
     setItemSelected(rowView); 

     Fragment newFragment; 
     switch (country.toLowerCase()) { 
      case "africa": 
       newFragment = new FragmentAfrica(); 
       break; 
      case "asia": 
       newFragment = new FragmentAsia(); 
       break; 
      case "europe": 
       newFragment = new FragmentEurope(); 
       break; 
      default: 
       newFragment = new FragmentAfrica(); 
     } 
     WorldActivity activity = (WorldActivity) view.getContext(); 
     FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 
     transaction.replace(R.id.detail_container, newFragment); 
     transaction.commit(); 
    } else { 
     Intent intent; 
     switch (country.toLowerCase()) { 
      case "africa": 
       intent = new Intent(getActivity(), AfricaActivity.class); 
       break; 
      case "asia": 
       intent = new Intent(getActivity(), AsiaActivity.class); 
       break; 
      case "europe": 
       intent = new Intent(getActivity(), EuropeActivity.class); 
       break; 
      default: 
       intent = new Intent(getActivity(), AfricaActivity.class); 
     } 

     startActivity(intent); 
    } 
} 
      you can replace the literals `africa`,`asia`,`europe` with anything you want 
+0

很酷。儘管爲什麼有'default:'那裏? – MacaronLover

+0

如果沒有'String'匹配你會用'FragmentAfrica'初始化'newFragment',那麼你的'if-else-if'階梯怎麼辦?我認爲它是一個默認情況,這就是爲什麼我添加它。 – Kainix

+0

如何使用字符串代替硬編碼? – MacaronLover