Android添加联系人信息并读取
效果图
题目
1. 创建一个File文件,路径为/mnt/sdcard/temp/zhiyuan.txt
2. 进入主页面后自动从File文件中读取联系人数据,每个item只显示,姓名和电话。如果,你在添加联系人时,填写了备注,那么item的姓名显示成你保存的备注。否则显示姓名。
3. 添加联系人功能,布局最上方有一个添加联系人按钮,下面是ListView, 当点击添加联系人按钮时,跳转至新页面,输入姓名,电话,备注(电话和 姓名不能为空,电话只能为数字)。确定后保存File文件,并且直接回退到 主页面
4. 当点击每个item时,跳转至详细页面,显示当前联系人的名字、电话、 备注。
代码演示
1.
新建一个Module命名为AndroidContact
在XML布局文件activity_main中添加一个Button按钮命名为添加联系人信息
再添加一个ListView用于显示接收的联系人信息
2.新建一个activity_item行布局文件用于将联系人信息以行布局的形式显示在ListView列表上
并添加两个TextView用于显示联系人姓名和电话
3.新建一个AddActivity类用于跳转添加联系人信息
再新建一个DetialActivity类用于跳转显示联系人信息详情
4.在XML布局文件activity_add中添加三个EditText用于输入联系人姓名,电话,备注
再添加一个Button用于将输入的联系人信息保存到File文件中
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类用于给列表添加适配器
7.在MyAdapter类中
编写一个私有的上下文对象(Context)和一个私有的ListmList;集合
构造一个List集合和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
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用于展示联系人姓名,电话,备注
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);
}
}