最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ExpandableListView長(zhǎng)按事件的完美解決辦法

 更新時(shí)間:2013年06月15日 11:05:05   作者:  
本篇文章是對(duì)Android中ExpandableListView長(zhǎng)按事件的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
關(guān)于ExpandableListView長(zhǎng)按事件處理,網(wǎng)上很多都是使用將上下文菜單注冊(cè)到ExpandableListView上實(shí)現(xiàn)長(zhǎng)按事件。

這樣做弊端顯而易見(jiàn),不夠靈活,不能分別對(duì)父項(xiàng)、子項(xiàng)、父項(xiàng)之間、子項(xiàng)之間彈出內(nèi)容做區(qū)分。
下面來(lái)說(shuō)我的解決方法,方法有點(diǎn)投機(jī)取巧。首先說(shuō)明一點(diǎn),使用我這種方法必須使用自定義的BaseExpandableListAdapter,至于為什么,具體后面講到。

ExpandableListView本身有繼承自AdapterView的setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener)方法。
實(shí)現(xiàn)監(jiān)聽(tīng)器:
復(fù)制代碼 代碼如下:

/**
  * 長(zhǎng)按郵箱快捷選項(xiàng)
  * @author King
  */
 private class QuickWayListener implements OnItemLongClickListener{
  @Override
  public boolean onItemLongClick(AdapterView<?> arg0, View view,
    int pos, long id) {
   //pos不可用說(shuō)明見(jiàn)下文
   return false;
  }
 }

如果這個(gè)方法是用在ListView長(zhǎng)按事件中剛剛好,但在ExpandableListView中,第三個(gè)參數(shù)pos不能區(qū)分開(kāi)點(diǎn)擊的是父項(xiàng)還是子項(xiàng),以及哪個(gè)父項(xiàng)或子項(xiàng)。

在ExpandableListView響應(yīng)的onItemLongCkick方法中,pos參數(shù)值為:從上到下,父項(xiàng)+展現(xiàn)的子項(xiàng)到點(diǎn)擊位置的數(shù)目(注意:是展現(xiàn)的,隱藏的子項(xiàng)不包括,從0開(kāi)始)。
例如:
父項(xiàng)1(隱藏3個(gè)子項(xiàng))
父項(xiàng)2
 |—子項(xiàng)2-0
 |—子項(xiàng)2-1
 |—子項(xiàng)2-2
長(zhǎng)按子項(xiàng)2-1時(shí),pos值為3。顯然根據(jù)pos值是無(wú)法確定點(diǎn)擊的是哪個(gè)子項(xiàng)或父項(xiàng)的。
因此依賴pos是很難處理點(diǎn)擊位置的。

如果可以直接在onItemLongClick方法中獲取groupPos,及childPos該多好呢?

于是看到了onItemLongClick方法第二個(gè)參數(shù):view。這里的view是你按中的位置對(duì)應(yīng)的view。view有個(gè)方法getTag(int key)。如果在創(chuàng)建此view的時(shí)候就把groupPos,childPos通過(guò)setTag(int key, Object value)設(shè)置進(jìn)去,在響應(yīng)onItemLongClick不就可以直接拿出來(lái)用了么。

現(xiàn)在就要講到必須使用自定義的BaseExpandableListAdapter的理由了。

要把groupPos,childPos通過(guò)setTag的方式綁定到view中,就必須操作該view的創(chuàng)建過(guò)程。要控制這個(gè)過(guò)程就必須要在自定義BaseExpandableListAdapter中重寫getGroupView及getChildView方法進(jìn)行操作。如下:
復(fù)制代碼 代碼如下:

public class AccountListAdapter extends BaseExpandableListAdapter {
 ...省略其他方法
 @Override
 public View getChildView(int groupPosition, int childPosition,
   boolean isLastChild, View convertView, ViewGroup parent) {
  //我這里僅通過(guò)自己寫的mkChildView()方法創(chuàng)建TextView來(lái)顯示文字,更復(fù)雜的可以通過(guò)LayoutInflater來(lái)填充一個(gè)view
  TextView childTv = mkChildView();
  // 標(biāo)記位置
  // 必須使用資源Id當(dāng)key(不是資源id會(huì)出現(xiàn)運(yùn)行時(shí)異常),android本意應(yīng)該是想用tag來(lái)保存資源id對(duì)應(yīng)組件。
  // 將groupPosition,childPosition通過(guò)setTag保存,在onItemLongClick方法中就可以通過(guò)view參數(shù)直接拿到了!
                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();
  // 設(shè)置同getChildView一樣
  groupTv.setTag(R.id.xxx01, groupPosition);
  groupTv.setTag(R.id.xxx02, -1); //設(shè)置-1表示長(zhǎng)按時(shí)點(diǎn)擊的是父項(xiàng),到時(shí)好判斷。
  groupTv.setText(groups[groupPosition]);
  return groupTv;
 }
}

完成了這一步,我們只需要在ExpandableListView響應(yīng)的onItemLongClick方法時(shí)通過(guò)view.getTag(R.id.xxx01),view.getTag(R.id.xxx02)即可拿到groupPos,childPos.
如下:
復(fù)制代碼 代碼如下:

       /**
  * 長(zhǎng)按郵箱快捷選項(xiàng)
  * @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); //參數(shù)值是在setTag時(shí)使用的對(duì)應(yīng)資源id號(hào)
   int childPos = (Integer)view.getTag(R.id.xxx02);
   if(childPos == -1){//長(zhǎng)按的是父項(xiàng)
       //根據(jù)groupPos判斷你長(zhǎng)按的是哪個(gè)父項(xiàng),做相應(yīng)處理(彈框等)
   } else {
       //根據(jù)groupPos及childPos判斷你長(zhǎng)按的是哪個(gè)父項(xiàng)下的哪個(gè)子項(xiàng),然后做相應(yīng)處理。 
   }
   return false;
  }
 }

到這就寫完了,貌似比較啰嗦。重寫B(tài)aseExpandableListAdapter寫的比較簡(jiǎn)潔,沒(méi)看明白的朋友可以先到網(wǎng)上查下怎么自定義BaseExpandableListAdapter,和自定義BaseAdapter其實(shí)是一樣的。

相關(guān)文章

最新評(píng)論

依兰县| 乡宁县| 衡阳县| 广饶县| 射洪县| 富平县| 阳泉市| 原平市| 伊金霍洛旗| 芮城县| 蒙自县| 田阳县| 阳朔县| 连平县| 含山县| 扎兰屯市| 鄂伦春自治旗| 肇州县| 鄂托克旗| 米林县| 三原县| 安宁市| 天门市| 扬中市| 离岛区| 茂名市| 明溪县| 瓦房店市| 潼南县| 嵊州市| 托克逊县| 博罗县| 太白县| 邵东县| 禄丰县| 鹰潭市| 周至县| 嘉义县| 博罗县| 蒙自县| 武功县|