Android ListView實現單選
阿新 • • 發佈:2019-01-23
1、佈局檔案
<ListView
android:id="@+id/navi_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8px"
android:paddingRight="8px"
/>
2、ListView的介面卡佈局檔案
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="@color/list_back" android:gravity="center" > <RadioButton android:id="@+id/navi_list_item_rb" style="@style/volume_fragment_rb_stytle" android:checked="false" android:clickable="false" android:focusable="false" /> <ImageView android:id="@+id/navi_list_item_iv" android:layout_marginLeft="10px" android:layout_width="30px" android:layout_height="30px" android:background="@drawable/ic_launcher" /> </LinearLayout>
3、主檔案和介面卡程式碼,下面是做語言適配時候的程式碼,供以後參考
4、所加許可權public class LanguageFragment extends RTBaseFragment implements OnItemClickListener { private String TAG = "LanguageFragment"; private ListView language_lv; private String[] languageItemString = null; // private final Locale[] languageLocalString = new Locale[]{Locale.SIMPLIFIED_CHINESE,Locale.TRADITIONAL_CHINESE,Locale.US,Locale.KOREA,Locale.JAPAN}; private final Locale[] languageLocalString = new Locale[]{Locale.SIMPLIFIED_CHINESE,Locale.US}; private List<LanguageInfo> mListLanguageInfo; private LanguageAdapter languageAdapter; private int selectPosition = 0;//預設顯示第一個 @Override protected int setView() { return R.layout.language_fragment_layout; } @Override protected void initView(View view) { language_lv = (ListView) view.findViewById(R.id.language_lv); // languageItemString = new String[]{mContext.getString(R.string.simplified_chinese),mContext.getString(R.string.traditional_chinese), // mContext.getString(R.string.language_english),mContext.getString(R.string.language_korea),mContext.getString(R.string.language_japan)}; languageItemString = new String[]{mContext.getString(R.string.simplified_chinese),mContext.getString(R.string.language_english)}; getListData(); initLanguage(); languageAdapter = new LanguageAdapter(mListLanguageInfo); language_lv.setAdapter(languageAdapter); } @Override protected void initEvent() { language_lv.setOnItemClickListener(this); } @Override protected void initData() { } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { LanguageInfo mInfo = mListLanguageInfo.get(position); updateLanguage(mInfo); selectPosition = position; languageAdapter.notifyDataSetChanged(); } public class LanguageAdapter extends BaseAdapter{ private List<LanguageInfo> list; public LanguageAdapter(List<LanguageInfo> listDates){ list = listDates; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if(convertView==null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.language_list_item, null); viewHolder = new ViewHolder(); viewHolder.radioButton = (RadioButton) convertView.findViewById(R.id.language_list_item_rb); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.radioButton.setText(list.get(position).getLanguage()); if(selectPosition == position){ viewHolder.radioButton.setChecked(true); } else{ viewHolder.radioButton.setChecked(false); } return convertView; } public class ViewHolder{ public RadioButton radioButton; } } /** * 初始化本地語言 */ private void initLanguage() { Locale currentLocale = getCurrentLocale(mContext); for (int i = 0; i < mListLanguageInfo.size(); i++) { Locale temp = mListLanguageInfo.get(i).getLocale(); if(temp.equals(currentLocale)){ //標記當前item selectPosition = i; return; } } } /** * 獲取資料 * @return */ public void getListData() { mListLanguageInfo = new ArrayList<LanguageInfo>(); for (int i = 0; i < languageItemString.length; i++) { LanguageInfo mLanguageInfo = new LanguageInfo(); mLanguageInfo.setLanguage(languageItemString[i]); mLanguageInfo.setLocale(languageLocalString[i]); mListLanguageInfo.add(mLanguageInfo); } } /** * 更換語言 * @param info */ public void updateLanguage(final LanguageInfo info){ new Thread(new Runnable() { @Override public void run() { // 更改系統語言 UpdateLanguageUtils.updateLanguage(info.getLocale()); } }).start(); } /** * 獲取當前系統語言 * @param mContext * @return */ public Locale getCurrentLocale(Context mContext){ Locale locale = mContext.getResources().getConfiguration().locale; return locale; } }
5、Utils相關程式碼<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
public class UpdateLanguageUtils {
public static void updateLanguage(Locale locale) {
try {
Object objIActMag, objActMagNative;
Class clzIActMag = Class.forName("android.app.IActivityManager");
Class clzActMagNative = Class
.forName("android.app.ActivityManagerNative");
Method mtdActMagNative$getDefault = clzActMagNative
.getDeclaredMethod("getDefault");
objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
Method mtdIActMag$getConfiguration = clzIActMag
.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) mtdIActMag$getConfiguration
.invoke(objIActMag);
config.locale = locale;
Class clzConfig = Class
.forName("android.content.res.Configuration");
java.lang.reflect.Field userSetLocale = clzConfig
.getField("userSetLocale");
userSetLocale.set(config, true);
Class[] clzParams = { Configuration.class };
Method mtdIActMag$updateConfiguration = clzIActMag
.getDeclaredMethod("updateConfiguration", clzParams);
mtdIActMag$updateConfiguration.invoke(objIActMag, config);
} catch (Exception e) {
e.printStackTrace();
}
}
}