联系人案例

项目中有用到联系人,就研究了下,参考了别人的demo,并且加上了自己的一些想法跟ui效果.有这方面需求的朋友可以拿去参考一下.

联系人字母排序参考文章,我也是参考他的:http://blog.csdn.net/xiaanming/article/details/12684155

我的项目实现了联系人排序,侧滑可以弹出联系人分组,以及添加联系人,删掉了搜索功能.增加了头像跟电话号码展示.

首先看下效果图片:

                                      



1.主MainActivity用来展示SlidingMenu    SlidingMenu加载左侧fragment(GroupFragment)    跟    中间的fragment (ContactFragment)

 注意: 把ContactFragment对象注入到GroupFragment中,因为点击群组的时候要更新ContactFragment界面.

public class MainActivity extends FragmentActivity {
	private SlidingMenu mSlidingMenu;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.contact_main);
		
		initViews();
		
		ImageView showGroup=(ImageView) findViewById(R.id.show_group);
		showGroup.setOnClickListener(listener);
		
		ImageView addContact=(ImageView) findViewById(R.id.add_contact);
		addContact.setOnClickListener(listener);
	}
	
	private void initViews() {
		mSlidingMenu = (SlidingMenu) findViewById(R.id.slidingmenu);
		
		mSlidingMenu.setContent(R.layout.contact_fragment);//中间布局
		mSlidingMenu.setMenu(R.layout.group_fragment);//左边布局
		
		ContactFragment contactFragment=new ContactFragment();
		
		FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
		ft.replace(R.id.contacts_fragment,contactFragment);
		ft.replace(R.id.group_fragment,new GroupFragment(contactFragment));
		ft.commit();
	}
	
	private OnClickListener listener=new OnClickListener() {
		@Override
		public void onClick(View v){
			switch (v.getId()) {
			case R.id.show_group:
				mSlidingMenu.toggle();//动态判断自动关闭或开启SlidingMenu
				break;
			case R.id.add_contact:
				Intent intent = new Intent(Intent.ACTION_INSERT,Contacts.CONTENT_URI);
				startActivityForResult(intent,108);
				break;
			}
		}
	};
	
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (108 == requestCode){
			Toast.makeText(MainActivity.this, "如果操作数据,请重新打开联系人...",Toast.LENGTH_LONG).show();
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK && mSlidingMenu.isMenuShowing()) {
			mSlidingMenu.showContent();
			return true;
		}
		return super.onKeyUp(keyCode, event);
	}
}

2.  ContactFragment  (中间内容显示的fragment)    初始化显示所有联系人.

     给SideBar添加监听事件,dialog的注入,ListView注入adapter,很简单的,相信大家都能看懂

public class ContactFragment extends Fragment implements GroupItemClick{
	private List<SWWContact> contactList;
	private Activity activity;
	private ListView sortListView;
	private ContactsAdapter adapter;
	
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		Log.i("fragment","onCreateView:"+getClass().getSimpleName());
		activity=getActivity();
		View mView = inflater.inflate(R.layout.contact_list, null);
		
		SideBar sideBar = (SideBar) mView.findViewById(R.id.sidrbar);
		TextView dialog = (TextView) mView.findViewById(R.id.dialog);
		sideBar.setTextView(dialog);
		
		//为ListView设置adapter
		sortListView = (ListView) mView.findViewById(R.id.country_lvcountry);
		contactList=SWWContactDB.findAllContacts(activity.getContentResolver());
		adapter = new ContactsAdapter(activity,contactList);
		sortListView.setAdapter(adapter);
		
		//设置右侧触摸监听
		sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
			@Override
			public void onTouchingLetterChanged(String s) {
				//该字母首次出现的位置
				int position = adapter.getPositionForSection(s.charAt(0));
				if(position != -1){
					sortListView.setSelection(position);
				}
			}
		});
		return mView;
	}
	
	@Override
	public void itemClick(List<SWWContact> contacts) {
		adapter.updateListView(contacts);
	}
}



3.GroupFragment  展示左侧群组数据,加载所有群组,以及群组点击事件,刷新右边联系人.

@SuppressLint("ValidFragment")
public class GroupFragment extends Fragment {
	private Activity activity;
	private List<SWWContactsGroup> groupList=new ArrayList<SWWContactsGroup>();
	
	private GroupItemClick groupClick;
	
	public GroupFragment(){
	}
	
	public GroupFragment(GroupItemClick groupClick){
		this.groupClick=groupClick;
	}
	
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		Log.i("fragment", "onCreateView:"+getClass().getSimpleName());
		activity=getActivity();
		this.groupList = SWWContactDB.queryGroup(activity);//得到所有组数据
		
		View view = inflater.inflate(R.layout.group_list, null);
		ListView groupListView=(ListView)view.findViewById(R.id.group_list);
		groupListView.setAdapter(new MyAdapter());
		return view;
	}
	
	/**
	 * 左侧联系人分组  点击回调接口
	 */
    public interface GroupItemClick{
    	public void itemClick(List<SWWContact> contacts);
    }
	
	
	private class MyAdapter extends BaseAdapter{
		private boolean isPressed[];
		
		public MyAdapter(){
			if(groupList.size()>0){
				isPressed = new boolean[groupList.size()];
				isPressed[0]=true;
			}
		}
		
		@Override
		public int getCount() {
			return groupList.size();
		}

		@Override
		public Object getItem(int position) {
			return groupList.get(position);
		}

		@Override
		public long getItemId(int position) {
			return groupList.get(position).getGroupId();
		}

		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if(null==convertView){
				holder=new ViewHolder();
				convertView=View.inflate(activity,R.layout.group_list_item, null);
				holder.groupName=(TextView) convertView.findViewById(R.id.group_name);
				convertView.setTag(holder);
			}else{
				holder=(ViewHolder) convertView.getTag();
			}
			holder.groupName.setText(groupList.get(position).getGroupName());
			
			holder.groupName.setBackgroundResource(isPressed[position]==true?R.color.light_blue:R.color.group_list);
			holder.groupName.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					changeState(position);
					notifyDataSetChanged();
					if(position==0){//点击全部按钮
						groupClick.itemClick(SWWContactDB.findAllContacts(activity.getContentResolver()));
					}else{
						int groupId=groupList.get(position).getGroupId();
						groupClick.itemClick(SWWContactDB.queryGroupMember(groupId,activity));
					}
				}
			});
			return convertView;
		}
		
		private void changeState(int position){
			isPressed=new boolean[isPressed.length];
			isPressed[position] = true;
		}
		
		private  class ViewHolder{
			private TextView groupName;
		}
	}
}

还有一些访问数据库, 以及一些工具类,我就不一一贴出来了,需要的要自己去下载源码......如果大家有什么疑问,请在下面留言.

源码下载地址  




posted @ 2015-01-10 00:33  安辉  阅读(208)  评论(0编辑  收藏  举报