Android學習筆記:如何對ExpandableListView進行精確的點擊或長按控制

在做項目中經常要用到ExpandableListView這個組件來對數據進行顯示,使用非常方便。其中也提供瞭很多對ExpandableListView進行各種操作的監聽,如下:

 
可以看到有對Group點擊、長按;有對Child單擊、長按;還有純粹的單擊、長按等等。並不是我覺得使用這些不方便,而是覺得對於一個新手在不怎麼熟悉api的情況下,該如何迅速的找到適合自己用的呢?例如:我在寫一個聊天的應用的時候,用的就是ExpandableListView來進行好友的顯示,默認分組為weimingming(未命名),在這裡我需要對組進行增刪改、對好友也要進行一些操作,對於組的增刪我放在瞭Menu裡面觸發,而對於組的改名,則是長按該group,然後可以進行上下文菜單設置或者通過彈出一個對話框來進行設置;對於好友有移動和一些權限的操作,都是通過長按放在上下文菜單中進行,如果單擊別人則跳入聊天界面,如果單擊或者長按自己,則顯示個人資料。當我不能正確處理上面的關系的時候,我就會對使用哪種監聽而不會產生功能重復方面感覺比較混亂。於是通過上網查瞭些資料發現一種比較好的方式,就是在適配器中產生groupView和childView的時候,分別進行Tag值的設置,如下:

getChildView:
[java] 
@Override 
    public View getChildView(final int arg0, final int arg1, boolean arg2, View view, 
            ViewGroup arg4) { 
        if(view==null){ 
            view = inflater.inflate(R.layout.team_layout_main_list_item, null); 
        } 
        TextView textView = (TextView) view.findViewById(R.id.team_main_list_username); 
        ImageView imageView = (ImageView) view.findViewById(R.id.team_main_list_head); 
        imageView.setImageResource(PrortaitUtils.conversionIdToRes(((UserInfo)getChild(arg0, arg1)).getPortrait())); 
        view.setTag(R.id.team_singlechat_id_send, arg0); 
        view.setTag(R.id.team_singlechat_id_close, arg1);       //備註1 
        textView.setText(((UserInfo)getChild(arg0, arg1)).getUsername()); 
        textView.setTextColor(Color.BLACK); 
        view.setBackgroundColor(Color.rgb(247, 243, 247)); 
        view.setBackgroundResource(R.drawable.team_item_bg_selector); 
        return view; 
    } 

getGroupView:
[java] 
@Override 
    public View getGroupView(int arg0, boolean arg1, View groupView, ViewGroup arg3) { 
        if(groupView == null){ 
            groupView = inflater.inflate(R.layout.team_layout_main_list_group, null); 
        } 
        TextView groupTextView = (TextView) groupView.findViewById(R.id.team_main_list_teamname); 
        ImageView groupImageView = (ImageView) groupView.findViewById(R.id.team_main_list_into); 
        groupImageView.setImageResource(R.drawable.team_into1); 
        if(arg1){ 
            groupImageView.setImageResource(R.drawable.team_into2); 
        } 
        groupView.setTag(R.id.team_singlechat_id_send, arg0); 
        groupView.setTag(R.id.team_singlechat_id_close, -1);        //備註2 
        groupTextView.setText(getGroup(arg0).toString()); 
        groupTextView.setTextColor(Color.BLACK); 
        return groupView; 
    } 

備註1:這裡因為是產生childView,所以這裡的group和child位置的值都已經給出,我們隻需要把這兩個值保存起來,setTag有一個方法裡面傳入兩個參數,第一個為資源文件中的id,這個id必須為資源文件中的id,而且要和groupView中設置的能對應起來,至於是哪一個組件的id無所謂,隻要你在用的時候能想起來,通過它得到你想要的位置值就行。第二個就是你要傳入的值,包括group和child的位置
備註2:這裡因為是產生groupView,所以這裡沒有child位置的值,隻有group的位置,因此我在這裡設置Tag的第二個值為-1,表示正在操作的不是child,當我在使用的時候就可以根據這個值是不是-1來判斷操作的是不是child瞭。
下面來看如何操作:
長按ExpandableListView,不通過監聽來區分group和child:
[java] view plaincopy
//長按條目,包括group和child 
    onLineList.setOnItemLongClickListener(new OnItemLongClickListener() { 
 
        @Override 
        public boolean onItemLongClick(AdapterView<?> arg0, final View arg1, 
                int arg2, long arg3) { 
            longClickListIteam(arg1); 
            return true; 
        } 
    }); 
     /**
      * 長按list中的某一個條目
      */    www.aiwalls.com
     private void longClickListIteam(final View arg1) { 
            final int groupPos = (Integer)arg1.getTag(R.id.team_singlechat_id_send);     
            final int childPos = (Integer)arg1.getTag(R.id.team_singlechat_id_close); 
            Log.i(TAG,"groupPos:"+groupPos+",childPos:"+childPos); 
            if(childPos == -1){         //如果得到child位置的值為-1,則是操作group 
                Log.i(TAG,"操作group組件"); 
                updateTeam(arg1); 
            }else{ 
                Log.i(TAG,"操作child組件");     //否則,操作child 
                final List<UserInfo> users = getTeamUser(groupPos); 
                //判斷長按的是否為自己,如果是不是自己,則彈出窗口操作,如果是自己,則查看資料 
                if(DicqConstant.DEFAULTMAC.equalsIgnoreCase(users.get(childPos).getUsermac())){ 
                    Intent it = new Intent(TeamMainActivity.this,UserInfoActivity.class); 
                    it.putExtra("isMyself", true); 
                    TeamMainActivity.this.startActivity(it); 
                }else{ 
                    builder = new AlertDialog.Builder(TeamMainActivity.this); 
                    builder.setTitle("操作用戶"); 
                    builder.setItems(new String[]{"查看資料","查看共享","移至分組","權限設置"}, new DialogInterface.OnClickListener() { 
                        public void onClick(DialogInterface dialog, int which) { 
                            if(which == 0){ 
                                Intent it = new Intent(TeamMainActivity.this,UserInfoActivity.class); 
                                it.putExtra("isMyself", false); 
                                it.putExtra("userinfo", users.get(childPos)); 
                                TeamMainActivity.this.startActivity(it); 
                            }else if(which == 1){ 
                                Intent it1 = new Intent(TeamMainActivity.this,FileShareActivity.class); 
                                it1.putExtra("userinfo",users.get(childPos)); 
                                TeamMainActivity.this.startActivity(it1); 
                            }else if(which == 2){ 
                                updateChild(groupPos,childPos); 
                            }else if(which == 3){ 
                                updateUserPrivilege(groupPos,childPos); 
                            } 
                        } 
                    }).show(); 
                } 
 
            } 
        } 
作者:duancanmeng

發佈留言