天天看點

Android之ListView+BaseAdapter左右按鍵切換

通過鍵盤的左右按鍵切換,使得目前的Item資料改變。這種用法已經超越了移動開發的範圍了...

一、先繼承一個Activity,并作相應的實作

public class MainActivity extends Activity {
	private ListView mListView;
	private List<Map<String, Object>> data;

	private CustomAdapter listAdapter;

	private String[] arrMenuItemName;
	private String[] arrSwitcher;
	private String[] arrOpen;

	private int iDelete;
	private int iSaved;
	private int iOpen;

	@Override
	public void onCreate(Bundle savedInstanceStated) {
		super.onCreate(savedInstanceStated);

		setContentView(R.layout.list_view);

		arrMenuItemName = this.getResources().getStringArray(R.array.menu_array);
		arrSwitcher = this.getResources().getStringArray(R.array.switcher);
		arrOpen = this.getResources().getStringArray(R.array.open_array);

		mListView = (ListView) findViewById(R.id.list_view_id);
		data = getData();
		listAdapter = new CustomAdapter(this, data);
		mListView.setAdapter(listAdapter);
	}
	//把鍵值與資料對應起來
	private List<Map<String, Object>> getData() {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Map<String, Object> map;
		for (int i = 0; i < arrMenuItemName.length; i++) {
			map = new HashMap<String, Object>();
			map.put("itemName", arrMenuItemName[i]);
			map.put("item_0", arrSwitcher[i]);
			map.put("item_1", arrSwitcher[i]);
			map.put("item_2", arrOpen[i]);
			list.add(map);
		}

		return list;
	}

	//響應鍵盤按鍵的左右切換
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		int iCurrItem = mListView.getSelectedItemPosition();

		switch (keyCode) {
		case KeyEvent.KEYCODE_DPAD_LEFT:
			switch (iCurrItem) {
			case 0:
				iSaved -= 1;
				if (iSaved < 0) {
					iSaved = arrSwitcher.length - 1;
				}
				data.get(iCurrItem).put("item_0", arrSwitcher[iSaved]);
				break;
			case 1:
				iDelete -= 1;
				if (iDelete < 0) {
					iDelete = arrSwitcher.length - 1;
				}
				data.get(iCurrItem).put("item_1", arrSwitcher[iDelete]);
				break;
			case 2:
				iOpen -= 1;
				if (iOpen < 1) {
					iOpen = arrOpen.length - 1;
				}
				data.get(iCurrItem).put("item_2", arrOpen[iOpen]);
				break;
			default:
				break;
			}
			//檢測到listAdapter資料有變化時,便更新整個ListView
			listAdapter.notifyDataSetChanged();
			break;

		case KeyEvent.KEYCODE_DPAD_RIGHT:
			switch (iCurrItem) {
			case 0:
				iSaved += 1;
				if (iSaved >= arrSwitcher.length) {
					iSaved = 0;
				}
				data.get(iCurrItem).put("item_0", arrSwitcher[iSaved]);
				break;
			case 1:
				iDelete += 1;
				if (iDelete >= arrSwitcher.length - 1) {
					iDelete = 0;
				}
				data.get(iCurrItem).put("item_1", arrSwitcher[iDelete]);
				break;
			case 2:
				iOpen += 1;
				if (iOpen >= arrOpen.length) {
					iOpen = 0;
				}
				data.get(iCurrItem).put("item_2", arrOpen[iOpen]);
				break;
			}
			listAdapter.notifyDataSetChanged();
			break;
		}
		return super.onKeyDown(keyCode, event);
	}
}
           

二、再從BaseAdapter繼承一個類并自定義

public class CustomAdapter extends BaseAdapter {
	private List<Map<String, Object>> data;
	private LayoutInflater mInflater;
	private Context mContext = null;

	public CustomAdapter(Context context, List<Map<String, Object>> getData) {
		this.data = getData;
		mContext = context;
		mInflater = LayoutInflater.from(mContext);
	}
	
	public Object getItem(int arg0) {
		return arg0;
	}

	public long getItemId(int position) {
		return position;
	}

	public int getCount() {
		return data.size();
	}

	@TargetApi(11)
	public View getView(int position, View convertView,
			android.view.ViewGroup parent) {
		final ViewHolder viewHolder;

		if (convertView == null) {
			viewHolder = new ViewHolder();
			convertView = mInflater.inflate(R.layout.item_custom, null);
			viewHolder.tvItemMenu = (TextView) convertView
					.findViewById(R.id.menu_text_id);
			viewHolder.tvSpinner = (TextView) convertView
					.findViewById(R.id.spinner_text_id);

			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}

		viewHolder.tvItemMenu
				.setText((String) data.get(position).get("itemName"));
		switch (position) {
		case 0:
			viewHolder.tvSpinner.setText((CharSequence) data.get(position).get(
					"item_0"));
			break;
		case 1:
			viewHolder.tvSpinner.setText((CharSequence) data.get(position).get(
					"item_1"));
			break;
		case 2:
			viewHolder.tvSpinner.setText((CharSequence) data.get(position).get(
					"item_2"));
			break;
		}

		return convertView;
	}

	private class ViewHolder {
		private TextView tvItemMenu;
		private TextView tvSpinner;
	}
}
           
Android之ListView+BaseAdapter左右按鍵切換

更多的了解請下載下傳