Android添加聯繫人信息並讀取

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)和一個私有的List<Map<String,String>>mList;集合
構造一個List<Map<String,String>>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<Map<String, String>> mList;

    //有參構造方法
    public MyAdapter(Context context, List<Map<String, String>> 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<Map<String, String>> mList;
    private Map<String, String> 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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章