Android添加联系人信息并读取

Android添加联系人信息并读取
效果图
Android添加联系人信息并读取_第1张图片
题目
1. 创建一个File文件,路径为/mnt/sdcard/temp/zhiyuan.txt
2. 进入主页面后自动从File文件中读取联系人数据,每个item只显示,姓名和电话。如果,你在添加联系人时,填写了备注,那么item的姓名显示成你保存的备注。否则显示姓名。
3.  添加联系人功能,布局最上方有一个添加联系人按钮,下面是ListView, 当点击添加联系人按钮时,跳转至新页面,输入姓名,电话,备注(电话和 姓名不能为空,电话只能为数字)。确定后保存File文件,并且直接回退到 主页面
4. 当点击每个item时,跳转至详细页面,显示当前联系人的名字、电话、 备注。

代码演示
1. 新建一个Module命名为AndroidContact
在XML布局文件activity_main中添加一个Button按钮命名为添加联系人信息
再添加一个ListView用于显示接收的联系人信息
Android添加联系人信息并读取_第2张图片
2.新建一个activity_item行布局文件用于将联系人信息以行布局的形式显示在ListView列表上
并添加两个TextView用于显示联系人姓名和电话
Android添加联系人信息并读取_第3张图片
3.新建一个AddActivity类用于跳转添加联系人信息
再新建一个DetialActivity类用于跳转显示联系人信息详情
Android添加联系人信息并读取_第4张图片
4.在XML布局文件activity_add中添加三个EditText用于输入联系人姓名,电话,备注
再添加一个Button用于将输入的联系人信息保存到File文件中
Android添加联系人信息并读取_第5张图片
5.在AddActivity中实例化EditText控件,Button控件,并给Button添加监听
在监听中实例化File对象,参数为路径名
判断文件是否存在,如果存在则存储数据并且追加数据属性
把文件 保存置为追加,true为追加
添加一个判断,如果联系人姓名,电话的内容不为空,则存储,备注信息可以为空
使用Toast提示存储是否成功
使用Finish();属性销毁页面返回主类
package com.example.cxy.androidcontact;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class AddActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText ed_Name, ed_Phone, ed_Remark;
    private Button btn_Save;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);
        initView();
    }

    private void initView() {
        ed_Name = (EditText) findViewById(R.id.editName);
        ed_Phone = (EditText) findViewById(R.id.editPhone);
        ed_Remark = (EditText) findViewById(R.id.editRemark);
        btn_Save = (Button) findViewById(R.id.btn_save);
        btn_Save.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        //判断文件是否存在,如果存在则存入数据,且为追加属性
        try {
            File file = new File("/mnt/sdcard/contact/contact.txt");
            if (!file.exists()) {
                file = new File("/mnt/sdcard/contact");
                file.mkdir();
                file = new File("/mnt/sdcard/contact/contact.txt");
                file.createNewFile();
            }
            //把你的文件保存置为追加。true则为追加
            FileOutputStream out = new FileOutputStream(file, true);
            //如果文本内容不为空,则存储
            if (!(TextUtils.isEmpty(ed_Name.getText().toString()) || TextUtils.isEmpty(ed_Phone.getText().toString()))) {
                String person = ed_Name.getText().toString() + "," + ed_Phone.getText().toString() + "," + ed_Remark.getText().toString() + "#";
                out.write(person.getBytes());
                out.close();
                Toast.makeText(AddActivity.this, "存储成功", Toast.LENGTH_SHORT).show();
                //页面销毁,返回主类
                finish();
            } else {
                Toast.makeText(AddActivity.this, "存储失败", Toast.LENGTH_SHORT).show();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
6.新建一个Package包命名为adapter
在包中新建一个MyAdapter类用于给列表添加适配器
Android添加联系人信息并读取_第6张图片
7.在MyAdapter类中 编写一个私有的上下文对象(Context)和一个私有的List>mList;集合
构造一个List>mList;集合和Context上下文对象的有参构造方法
并使本类继承于 BaseAdapter类(public class MyAdapter extends BaseAdapter
将获取列表总长度的getCount()方法的返回值改为mList.size()返回全局的列表总长度
将获取当前整个Item的getItem()方法的返回值改为mList.get(position)返回一个当前视图中所有数据的下标
将获取当前Item的id的getItemId()方法的返回值改为position()返回Id的下标
将获取视图的getView()方法的返回值改为converView()返回当前视图给用户看
创建一个ViewHolder内部类对象 用于声明activity_item行布局的TextView控件
创建ViewHodler类对象
添加判断当前converView是否为空如果为空则加载新的Item行布局
实例化ViewHodler并通过视图寻找控件Id
设置converView缓存标签,并传入控件
从converView视图中获取缓存标签
将对应下标的值赋给对应位置
添加判断如果联系人备注为空则显示电话,如果不为空则在电话位置显示备注
package com.example.cxy.androidcontact.adapter;

import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.cxy.androidcontact.R;

import java.util.List;
import java.util.Map;

/**
 * Created by admin on 2017/3/5.
 */
public class MyAdapter extends BaseAdapter {
    private Context mContext;
    private List> mList;

    //有参构造方法
    public MyAdapter(Context context, List> list) {
        mContext = context;
        mList = list;
    }

    //获取列表总长度
    @Override
    public int getCount() {
        //返回一个全局的列表的总长度
        return mList.size();
    }

    //获取当前整个item(一整行)返回一个当前视图中的所有数据
    @Override
    public Object getItem(int position) {
        //返回下标
        return mList.get(position);
    }

    //获取当前itemID
    @Override
    public long getItemId(int position) {
        //返回下标
        return position;
    }

    //获取视图              当前视图下标     指当前视图           上级父容器
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //创建一个ViewHodler类对象
        ViewHodler viewHodler;
        //判断当前converView是否为空,如果为空
        if (convertView == null) {
            //则加载新的item行布局
            convertView = LayoutInflater.from(mContext).inflate(R.layout.activity_item, null);
            //实例化viewHodler
            viewHodler = new ViewHodler();
            //通过视图寻找控件ID
            viewHodler.tvName = (TextView) convertView.findViewById(R.id.tv_Name);
            viewHodler.tvPhone = (TextView) convertView.findViewById(R.id.tv_Phone);
            //设置convertView缓存标签,传入控件
            convertView.setTag(viewHodler);
        } else {
            //convertView视图中获取缓存的标签
            viewHodler = (ViewHodler) convertView.getTag();
        }
        //将对应下标的值赋给对应位置
        viewHodler.tvName.setText(mList.get(position).get("name"));
        //如果联系人备注为空则显示电话,如果不为空则在电话位置显示备注
        if (TextUtils.isEmpty(mList.get(position).get("remark"))) {
            viewHodler.tvPhone.setText(mList.get(position).get("phone"));
        } else {
            viewHodler.tvPhone.setText(mList.get(position).get("remark"));
        }
        //返回当前converView视图给用户看
        return convertView;
    }

    //自定义内部类ViewHolder
    class ViewHodler {
        private TextView tvName, tvPhone;
    }
}
8.在主类MainActivity中创建私有的Button控件,ListView控件,List集合,Map集合
adapter适配器
使用initView方法初始化控件和List集合
在initView方法中实例化List数组,实例化Button按钮和ListView控件,并给Button按钮和ListView列表控件添加监听点击事件
在Button按钮的点击事件中添加跳转,跳转至AddActivity类
在ListView控件的点击事件中添加跳转,跳转至DetialActivity类,并将联系人信息传输到DetialActivity详情类
添加一个writeFile方法用于从File文件中读取数据
实例化File对象,参数为路径名
添加判断如果文件存在则读取,不存在则不读取
输出File文件中的内容
定义byte[]字节数组,使用available方法读取文件中存储的信息长度
调用read方法将bytes数组中的数据读取
关闭输出流
把文件中读取到的内容全部转化为字符串
先用#号将每个人分割
使用循环将单个联系人的三个属性分开
使用split分割将person数组中的信息用逗号分开
实例化Map集合
使用循环输出信息
存放集合
添加onResume方法使每次进入先清理集合,然后再次获取数据
并且如果适配器没有实例化,则实例化,否则则刷新
package com.example.cxy.androidcontact;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import com.example.cxy.androidcontact.adapter.MyAdapter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {
    private Button btn_add;
    private ListView mListView;
    private List> mList;
    private Map mMap;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件和List集合的方法
        initview();
    }

    //从文件中读取数据的方法
    private void writeFile() {
        try {
            //实例化File对象,参数为路径名
            File file = new File("/mnt/sdcard/contact/contact.txt");
            //判断文件是否存在,存在则读取,不存在的不读取
            if (file.exists()) {
                //File文件输出
                FileInputStream input = new FileInputStream(file);
                //定义byte[]字节数组,使用available方法读取文件中存储的信息长度
                byte[] bytes = new byte[input.available()];
                //调用read方法将bytes数组中的数据读取
                input.read(bytes);
                //关闭输出流
                input.close();
                //把文件中读取到的内容全部转化为字符串
                String content = new String(bytes);
                //先以#号分割为每一个人
                String[] person = content.split("#");
                //使用循环把每一个人的三个属性分开
                for (int i = 0; i < person.length; i++) {
                    //使用split分割将person数组中的信息用逗号分隔开
                    String[] split = person[i].split(",");
                    mMap = new HashMap<>();
                    //使用循环输出信息
                    for (int x = 0; x < split.length; x++) {
                        if (x == 0) {
                            mMap.put("name", split[x]);
                        } else if (x == 1) {
                            mMap.put("phone", split[x]);
                        } else if (x == 2) {
                            mMap.put("remark", split[x]);
                        }
                    }
                    //存放集合
                    mList.add(mMap);
                }

            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void initview() {
        mList = new ArrayList<>();
        btn_add = (Button) findViewById(R.id.btn_add);
        mListView = (ListView) findViewById(R.id.listView);
        btn_add.setOnClickListener(this);
        mListView.setOnItemClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setClass(this, AddActivity.class);
        startActivity(intent);
    }

    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        Intent intent = new Intent();
        intent.setClass(this, DetialActivity.class);
        //将联系人信息传到DetialActivity类中
        intent.putExtra("name", mList.get(position).get("name"));
        intent.putExtra("phone", mList.get(position).get("phone"));
        intent.putExtra("remark", mList.get(position).get("remark"));
        startActivity(intent);
    }

    //此方法,每次进入先清理集合,然后再次获取数据,
    //并且如果适配器没有实例化,则实例化,否则则刷新
    @Override
    protected void onResume() {
        super.onResume();
        mList.clear();
        writeFile();
        if (adapter != null) {
            adapter.notifyDataSetChanged();
        } else {
            adapter = new MyAdapter(this, mList);
            mListView.setAdapter(adapter);
        }
    }
}
9.在XML布局文件activity_detial中添加三个TextView用于展示联系人姓名,电话,备注
Android添加联系人信息并读取_第7张图片
10.在DetialActivity类中实例化TextView
添加initView方法,初始化控件
在initView方法中实例化TextView控件
接收跳转
定义一个字符串接收MainActivity所传输的联系人姓名,电话,备注
将接收的联系人姓名,电话,备注显示在TextView中
package com.example.cxy.androidcontact;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class DetialActivity extends AppCompatActivity {
    private TextView tv_Name, tv_Phone, tv_Remark;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detial);
        initView();
    }

    private void initView() {
        tv_Name = (TextView) findViewById(R.id.tvName);
        tv_Phone = (TextView) findViewById(R.id.tvPhone);
        tv_Remark = (TextView) findViewById(R.id.tvRemark);
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        String phone = intent.getStringExtra("phone");
        String remark = intent.getStringExtra("remark");
        tv_Name.setText(name);
        tv_Phone.setText(phone);
        tv_Remark.setText(remark);
    }
}

你可能感兴趣的:(Model)