# 定制通讯录

在添加了通讯录的基础上，可以做相应的定制化操作。包括：通讯录列表点击事件响应处理，定制通讯录列表的功能项等。

## 设置通讯录列表点击事件响应处理

通讯录列表提供点击事件的响应处理函数，见 `ContactEventListener` ：

- 通讯录联系人项点击事件处理
- 通讯录联系人项长按事件处理，一般弹出菜单：移除好友、添加到星标好友等
- 联系人头像点击相应

```java
// 在Application初始化中设置
NimUIKit.setContactEventListener(new ContactEventListener() {
    @Override
    public void onItemClick(Context context, String account) {
    	 // 进入个人资料页，开发者自行实现
        UserProfileActivity.start(context, account);
    }

    @Override
    public void onItemLongClick(Context context, String account) {

    }

    @Override
    public void onAvatarClick(Context context, String account) {
    	 // 进入个人资料页，开发者自行实现
        UserProfileActivity.start(context, account);
    }
});
```

## 定制通讯录列表功能项

定制通讯录列表功能项依靠 `ContactsCustomization` 实现，例如折叠群、黑名单、消息验证、我的电脑等。

首先定义功能项 `FuncItem`，示例：

```java
public final static class FuncItem extends AbsContactItem {
    static final FuncItem NORMAL_TEAM = new FuncItem();
    static final FuncItem BLACK_LIST = new FuncItem();

    @Override
    public int getItemType() {
        return ItemTypes.FUNC;
    }

    @Override
    public String belongsGroup() {
        return null;
    }

    public static final class FuncViewHolder extends AbsContactViewHolder<FuncItem> {
        private ImageView image;
        private TextView funcName;
        private TextView unreadNum;

        @Override
        public View inflate(LayoutInflater inflater) {
            View view = inflater.inflate(R.layout.func_contacts_item, null);
            this.image = (ImageView) view.findViewById(R.id.img_head);
            this.funcName = (TextView) view.findViewById(R.id.tv_func_name);
            this.unreadNum = (TextView) view.findViewById(R.id.tab_new_msg_label);

            return view;
        }

        @Override
        public void refresh(ContactDataAdapter contactAdapter, int position, FuncItem item) {
            if (item == NORMAL_TEAM) {
                funcName.setText("讨论组");
                image.setImageResource(R.drawable.ic_secretary);
            } else if (item == BLACK_LIST) {
                funcName.setText("黑名单");
                image.setImageResource(R.drawable.ic_black_list);
            }
        }
    }

    static List<AbsContactItem> provide() {
        List<AbsContactItem> items = new ArrayList<AbsContactItem>();
        items.add(NORMAL_TEAM);
        items.add(BLACK_LIST);

        return items;
    }

    static void handle(Context context, AbsContactItem item) {
        if (item == NORMAL_TEAM) {
            TeamListActivity.start(context, ItemTypes.TEAMS.NORMAL_TEAM);
        } else if (item == BLACK_LIST) {
            BlackListActivity.start(context);
        }
    }
}
```
然后添加功能项到 `ContactsCustomization`：

```java
// 功能项定制
fragment.setContactsCustomization(new ContactsCustomization() {
    @Override
    public Class<? extends AbsContactViewHolder<? extends AbsContactItem>> onGetFuncViewHolderClass() {
        return FuncItem.FuncViewHolder.class;
    }

    @Override
    public List<AbsContactItem> onGetFuncItems() {
        return FuncItem.provide();
    }

    @Override
    public void onFuncItemClick(AbsContactItem item) {
        FuncItem.handle(getActivity(), item);
    }
});

```

