系列文章:
- 联系人项目(知识预热)
- 联系人项目(ViewPager和底部联动)
- 联系人项目(查询联系人数据)
- 联系人项目(显示联系人数据)
- 联系人项目(显示通话记录)
- 联系人项目(显示拨号界面)
- 联系人项目(短信显示)
- 联系人项目(短信详情显示)
- 联系人项目(总)
创建ContactAdapter
public class ContactAdapter extends BaseAdapter {
private Context context;
private List<Contact> contacts;
private LayoutInflater inflater;
public ContactAdapter(Context context, List<Contact> contacts) {
this.context = context;
this.contacts = contacts;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return contacts.size();
}
@Override
public Contact getItem(int i) {
return contacts.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder = null;
if(view == null){
view = inflater.inflate(R.layout.item_contact,null);
viewHolder = new ViewHolder();
viewHolder.circleImageView = view.findViewById(R.id.circleImageView);
viewHolder.textView = view.findViewById(R.id.textView);
view.setTag(viewHolder);
}
viewHolder = (ViewHolder) view.getTag();
//设置参数
Contact contact = getItem(i);
viewHolder.textView.setText(contact.getName());
Bitmap bitmap = BitmapUtils.getPhoto(contact.getPhotoId());
if(bitmap != null){
viewHolder.circleImageView.setImageBitmap(bitmap);
}else {
viewHolder.circleImageView.setImageResource(R.mipmap.contact);
}
return view;
}
class ViewHolder{
CircleImageView circleImageView;
TextView textView;
}
}
其中item_contact
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".activity.MainActivity"
android:orientation="vertical"
android:gravity="center"
>
<com.example.xx.contactapplication.ui.CircleImageView
android:id="@+id/circleImageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@mipmap/contact"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="联系人姓名"/>
</LinearLayout>
其中圆形头像用的CircleImageView,可以直接把Github项目中的CircleImageView.java和res下的attrs复制到项目中用即可
https://github.com/hdodenhof/CircleImageView
要显示头像,我们需要创建工具类BitmapUtils
public class BitmapUtils {
//缓存
private static HashMap<Integer,SoftReference<Bitmap>> cache = new HashMap<Integer,SoftReference<Bitmap>>();
public static Bitmap getPhoto(int photoId) {
//photoId关联data表的"_id"
//头像在data15里
Bitmap bitmap = null;
//如果没有头像
if(photoId == 0){
return null;
}
//先去缓存中找找,有没有加载过的缓存
SoftReference<Bitmap> ref = cache.get(photoId);
if(ref!=null){
bitmap = ref.get();
if(bitmap!=null){
return bitmap;
}
}
ContentResolver r = Myapplication.getApp().getContentResolver();
Uri dataUri = ContactsContract.Data.CONTENT_URI;
String[] columns = {ContactsContract.Data.DATA15};
String selection = ContactsContract.Data._ID+"=?";
String[] selectionArgs = {photoId+""};
Cursor c = r.query(dataUri, columns, selection, selectionArgs, null);
if(c.moveToNext()){
byte[] bytes = c.getBlob(0);
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
cache.put(photoId,new SoftReference<Bitmap>(bitmap));
}
c.close();
return bitmap;
}
}
ContactFragment
public class ContactFragment extends Fragment implements IContactView{
private List<Contact> list;
private IContactPresenter presenter;
private ContactAdapter adapter;
private GridView gridView;
public ContactFragment() {
this.presenter = new ContactPresenterImpl(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//调用presenter方法,记载所有联系人
presenter.loadAllContacts();
View view = inflater.inflate(R.layout.fragment_contactfragment,null);
//初始化控件
setViews(view);
return view;
}
private void setViews(View view) {
gridView = view.findViewById(R.id.gridView);
}
@Override
public void setData(List<Contact> list) {
this.list = list;
}
@Override
public void showList() {
//自定义adapter 更新界面
//Log.d("contact_info",list.toString());
adapter = new ContactAdapter(getActivity(),list);
gridView.setAdapter(adapter);
}
}
最终效果
需要修改adapter
public class ContactAdapter extends BaseAdapter {
......
public ContactAdapter(Context context, List<Contact> contacts) {
this.context = context;
this.contacts = contacts;
//向集合为0的位置插入一个空对象
contacts.add(0,new Contact());
this.inflater = LayoutInflater.from(context);
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
......
//设置参数
//判断是下标为0的位置
if(i==0){
viewHolder.circleImageView.setImageResource(R.mipmap.add);
viewHolder.textView.setText("添加联系人");
return view;
}
Contact contact = getItem(i);
viewHolder.textView.setText(contact.getName());
......
}
......
}
单击每个联系人弹出具体信息
dialog_contract_detail.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity"
android:gravity="center"
android:padding="20dp"
>
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_below="@+id/circleImageView"
android:background="@android:color/white">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#2589FF"
android:paddingLeft="10dp"
android:paddingRight="10dp"
>
<ImageView
android:id="@+id/img_edit"
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@mipmap/edit"/>
<ImageView
android:id="@+id/img_close"
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@mipmap/delete"
android:layout_alignParentRight="true"/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"
android:textColor="@android:color/white"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<LinearLayout
android:layout_width="0dp"
android:layout_height="60dp"
android:orientation="vertical"
android:gravity="center_vertical"
android:layout_weight="1"
android:paddingLeft="10dp"
android:paddingRight="10dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="13333333333"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="河北省秦皇岛市海港区"/>
</LinearLayout>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/more"/>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:background="#cdcdcd"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<LinearLayout
android:layout_width="0dp"
android:layout_height="60dp"
android:orientation="vertical"
android:gravity="center_vertical"
android:layout_weight="1"
android:paddingLeft="10dp"
android:paddingRight="10dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="13333333333"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="河北省秦皇岛市海港区"/>
</LinearLayout>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/more"/>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:background="#cdcdcd"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<LinearLayout
android:layout_width="0dp"
android:layout_height="60dp"
android:orientation="vertical"
android:gravity="center_vertical"
android:layout_weight="1"
android:paddingLeft="10dp"
android:paddingRight="10dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="13333333333"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="河北省秦皇岛市海港区"/>
</LinearLayout>
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/more"/>
</LinearLayout>
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:background="#cdcdcd"/>
</LinearLayout>
</LinearLayout>
<com.example.xx.contactapplication.ui.CircleImageView
android:id="@+id/circleImageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@mipmap/ic_launcher"
android:layout_centerHorizontal="true"
android:layout_marginBottom="-30dp"
/>
</RelativeLayout>
ContactFragment
public class ContactFragment extends Fragment implements IContactView{
private List<Contact> list;
private IContactPresenter presenter;
private ContactAdapter adapter;
private GridView gridView;
public ContactFragment() {
this.presenter = new ContactPresenterImpl(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//调用presenter方法,记载所有联系人
presenter.loadAllContacts();
View view = inflater.inflate(R.layout.fragment_contactfragment,null);
//初始化控件
setViews(view);
setListeners();
return view;
}
private void setListeners() {
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(i==0){
//跳转添加联系人界面
return;
}
Contact contact = list.get(i);
//弹出对话框
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final AlertDialog dialog = builder.create();
dialog.show();
//自定义ui
View dialogView = View.inflate(getActivity(),R.layout.dialog_contract_detail,null);
//通过dialogView.findViewById找到界面中数据
ImageView imageView = (ImageView)dialogView.findViewById(R.id.circleImageView);
Bitmap bitmap = BitmapUtils.getPhoto(contact.getPhotoId());
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
}else {
imageView.setImageResource(R.mipmap.ic_launcher);
}
//设置姓名
TextView tv_name = (TextView)dialogView.findViewById(R.id.tv_name);
tv_name.setText(contact.getName());
//关闭
ImageView img_close = (ImageView)dialogView.findViewById(R.id.img_close);
img_close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
Window window = dialog.getWindow();
window.setContentView(dialogView);
}
});
}
private void setViews(View view) {
gridView = view.findViewById(R.id.gridView);
}
@Override
public void setData(List<Contact> list) {
this.list = list;
}
@Override
public void showList() {
//自定义adapter 更新界面
//Log.d("contact_info",list.toString());
adapter = new ContactAdapter(getActivity(),list);
gridView.setAdapter(adapter);
}
}