版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010356768/article/details/84987718
创建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);
}
}