【达内课程】联系人项目(显示联系人数据)

系列文章:

  1. 联系人项目(知识预热)
  2. 联系人项目(ViewPager和底部联动)
  3. 联系人项目(查询联系人数据)
  4. 联系人项目(显示联系人数据)
  5. 联系人项目(显示通话记录)
  6. 联系人项目(显示拨号界面)
  7. 联系人项目(短信显示)
  8. 联系人项目(短信详情显示)
  9. 联系人项目(总)

在这里插入图片描述
创建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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值