ListView自定义视图中对Button按钮实现仅允许一个按钮处于开启状态
2019獨角獸企業重金招聘Python工程師標準>>>
Android項目迭代,之前使用下拉框Spinner被替換成ListView,相應的實現也比之前更加復雜了,根據美工給出的界面進行設計,要實現的效果如下:?
????????????????????????????????????????
根據圖示 可知,ListView需要自定義試圖,而且視圖中有按鈕,按鈕之間只允許一個為“開啟”狀態。
通過以上分析,我們大致可以知道實現的思路是:重寫適配器,通過布局填充器填充自定義視圖。然后針對按鈕或ListView的Item實現單擊操作。
在實際的編碼中,我新建自己的Adapter(繼承自BaseAdapter),重寫getView()方法,開始針對按鈕添加單擊事件,這樣雖然實現了按鈕狀態的切換,但是并不能操作兄弟按鈕的狀態。經過到社區和群里討論與指導,我發現之前的方向有一定的問題,正確的方向應該是把填充的按鈕對象都放到一個集合里,在觸動單擊事件的時候遍歷集合里的元素,改變其狀態。
為了達到更好的用戶體驗,我選擇針對ListView的單擊事件,這樣,用戶只有觸發ListView里的Item,就可以相應,不用再費力的點擊那個小按鈕了。此處需要注意的地方是ListView里的子控件Button會屏蔽Listview的單擊事件,需要對Button進行處理,阻止單擊與獲得焦點等功能。可以在xml文件中對其定義:
android:focusable="false" android:clickable="false" android:focusableInTouchMode="false" ??重寫getView()方法的實現:
public View getView(final int position, View convertView, ViewGroup parent) {final int selectID = position;ListItemView listItemView = null;if (convertView == null) {listItemView = new ListItemView();convertView = listContainer.inflate(R.layout.item, null);//獲取自定義視圖// 獲取控件對象listItemView.vpnSwitch = (Button) convertView.findViewById(R.id.btn_server);btnMap.add(listItemView.vpnSwitch);//把Button添加到集合中// 設置控件集到convertViewconvertView.setTag(listItemView);} else {listItemView = (ListItemView) convertView.getTag();}listItemView.vpnSwitch.setText("關");convertView.setClickable(true);convertView.setId(position);convertView.setOnClickListener(myClickListener);//針對ListView Item添加單擊事件return convertView;} ListView單擊事件的監聽器: public OnClickListener myClickListener = new OnClickListener() {public void onClick(View v) {int position = v.getId();//遍歷并更改按鈕狀態for (int i=0,n=btnMap.size(); i<n ;i++) {((Button)btnMap.get(i)).setText("關");}//獲取ListItemViewListItemView listItemView = (ListItemView) v.getTag();//針對具體空間的其他操作listItemView.vpnSwitch……} };回過頭來看,實現僅允許一個按鈕處于激活狀態的原理就是先把ListView自動創建的Button放進集合里,然后對其進行集中管理。我想如果在getView中實現單個按鈕的點擊事件來影響兄弟按鈕的狀態也應該是可行的,有興趣的讀者可以動手試一試:)?
轉載于:https://my.oschina.net/hanzhankang/blog/112008
總結
以上是生活随笔為你收集整理的ListView自定义视图中对Button按钮实现仅允许一个按钮处于开启状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载] 信息系统项目管理挂靠合同(协议
- 下一篇: 带你攀顶云端高级认证,有这回事?