1. 程式人生 > >Android ListView實現單選

Android ListView實現單選

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、主檔案和介面卡程式碼,下面是做語言適配時候的程式碼,供以後參考
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;
	}
}
4、所加許可權
<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" /> 
5、Utils相關程式碼
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();
		}
	}

}