關于ExpandableListView長按事件處理,網上很多都是使用將上下文菜單注冊到ExpandableListView上實現長按事件。
這樣做弊端顯而易見,不夠靈活,不能分別對父項、子項、父項之間、子項之間彈出內容做區分。
下面來說我的解決方法,方法有點投機取巧。首先說明一點,使用我這種方法必須使用自定義的BaseExpandableListAdapter,至于為什么,具體后面講到。
ExpandableListView本身有繼承自AdapterView的setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener)方法。
實現監聽器:
/**
* 長按郵箱快捷選項
* @author King
*/
private class QuickWayListener implements OnItemLongClickListener{
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View view,
int pos, long id) {
//pos不可用說明見下文
return false;
}
}
如果這個方法是用在ListView長按事件中剛剛好,但在ExpandableListView中,第三個參數pos不能區分開點擊的是父項還是子項,以及哪個父項或子項。
在ExpandableListView響應的onItemLongCkick方法中,pos參數值為:從上到下,父項+展現的子項到點擊位置的數目(注意:是展現的,隱藏的子項不包括,從0開始)。
例如:
父項1(隱藏3個子項)
父項2
|―子項2-0
|―子項2-1
|―子項2-2
長按子項2-1時,pos值為3。顯然根據pos值是無法確定點擊的是哪個子項或父項的。
因此依賴pos是很難處理點擊位置的。
如果可以直接在onItemLongClick方法中獲取groupPos,及childPos該多好呢?
于是看到了onItemLongClick方法第二個參數:view。這里的view是你按中的位置對應的view。view有個方法getTag(int key)。如果在創建此view的時候就把groupPos,childPos通過setTag(int key, Object value)設置進去,在響應onItemLongClick不就可以直接拿出來用了么。
現在就要講到必須使用自定義的BaseExpandableListAdapter的理由了。
要把groupPos,childPos通過setTag的方式綁定到view中,就必須操作該view的創建過程。要控制這個過程就必須要在自定義BaseExpandableListAdapter中重寫getGroupView及getChildView方法進行操作。如下:
public class AccountListAdapter extends BaseExpandableListAdapter {
...省略其他方法
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
//我這里僅通過自己寫的mkChildView()方法創建TextView來顯示文字,更復雜的可以通過LayoutInflater來填充一個view
TextView childTv = mkChildView();
// 標記位置
// 必須使用資源Id當key(不是資源id會出現運行時異常),android本意應該是想用tag來保存資源id對應組件。
// 將groupPosition,childPosition通過setTag保存,在onItemLongClick方法中就可以通過view參數直接拿到了!
childTv.setTag(R.id.xxx01, groupPosition);
childTv.setTag(R.id.xxx02, childPosition);
return childTv;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
TextView groupTv = mkGroupView();
// 設置同getChildView一樣
groupTv.setTag(R.id.xxx01, groupPosition);
groupTv.setTag(R.id.xxx02, -1); //設置-1表示長按時點擊的是父項,到時好判斷。
groupTv.setText(groups[groupPosition]);
return groupTv;
}
}
完成了這一步,我們只需要在ExpandableListView響應的onItemLongClick方法時通過view.getTag(R.id.xxx01),view.getTag(R.id.xxx02)即可拿到groupPos,childPos.
如下:
/**
* 長按郵箱快捷選項
* @author King
*/
private class QuickWayListener implements OnItemLongClickListener{
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View view,
int pos, long id) {
int groupPos = (Integer)view.getTag(R.id.xxx01); //參數值是在setTag時使用的對應資源id號
int childPos = (Integer)view.getTag(R.id.xxx02);
if(childPos == -1){//長按的是父項
//根據groupPos判斷你長按的是哪個父項,做相應處理(彈框等)
} else {
//根據groupPos及childPos判斷你長按的是哪個父項下的哪個子項,然后做相應處理。
}
return false;
}
}
到這就寫完了,貌似比較
主站蜘蛛池模板:
嫩草影院网站入口
|
久久一级
|
天天色天天色
|
欧美性一区二区三区
|
精品视频在线观看
|
欧美自拍一区
|
欧美日韩在线免费
|
日本一区二区三区四区视频
|
久草综合网
|
欧美午夜视频
|
精品久久久久久久久久久院品网
|
成人免费crm在线观看
|
91碰碰|
日韩精品一区二区三区
|
日本妇人成熟免费视频
|
日本免费精品
|
久久九九久久精品
|
久草 在线
|
国产欧美在线观看
|
国产电影一区二区三区图片
|
国产精品久久久久久久久久免费看
|
国产午夜精品一区二区三区视频
|
成人欧美一区二区三区黑人麻豆
|
欧美午夜精品一区二区三区电影
|
久久成人在线视频
|
嫩草影院永久入口
|
日本黄色电影网址
|
国产成人午夜精品影院游乐网
|
最新亚洲黄色网址
|
免费观看成人毛片
|
亚洲天堂美女视频
|
国产二区三区
|
国产成人影院
|
日产精品久久久一区二区
|
国产精品二区三区
|
中文字幕_第2页_高清免费在线
|
欧美精品亚洲精品
|
91欧美|
日韩av不卡在线播放
|
欧美一区二区免费
|
igao视频|