android自定义View之Android手机通讯录制作

合集下载

Android开发实验---通讯录

Android开发实验---通讯录

实验报告通讯录姓名:学号:课程名称:移动应用开发所在学院:信息科学与工程学院专业班级:计算机任课教师:主要功能分析:1、增加、删除、编联系人点击通信录界面中的增加按钮,入增加联系人面。

输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,击确认返回主界面。

点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改系人的资料或进行删除联系人操作,完成后退回到主界面。

对列表中联系人的标记,点mnu键弹出功能界面上的删除按键也可进行删除。

还可以在菜单上选择删除全部联系人清空通讯录。

在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则系人信息将继续保存。

2、查找联系人用户点击menu键打开底部菜单框,底部菜单框为查询系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话息排列,用户点击查找按键输入联系人基本信息,,通讯录显所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。

3、通功能用户在通录选择联系人进入联系详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息的功能进行操作。

4、菜单能通过对menu按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,菜单按键则包含显示所有、删除所有等实用功能。

增加联系人:这个功能由ContactAdder类完成,具体实现不是比较麻烦,保存动作由ContentResolver类解决,但实现方式有所不同,可分为一次性批量增加与挨个增加。

由于界面设置繁琐,代码页过多,所以挑出其中的一部分进行说明首先是DB数据库建库过程:package com.xample.hivian.my_contact_manager.models.db;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteOpenHelper;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import com.example.hivian.my_contact_manager.models.Contact;import com.example.hivian.my_contact_manager.models.Sms;import java.util.ArrayList;import java.util.List;public class DBHandler extends SQLiteOpenHelper {// Database Versionprivate static final int DB_VERSION = 1;// Database Nameprivate static final String DB_NAME = "DB";// Contacts table nameprivate static final String CONTACTS_TABLE = "contacts";//通讯录private static final String SMS_TABLE = "sms";// Shops Table Columns names private static final String KEY_ID = "id";private static final String KEY_IMAGE = "image";//图片private static final String KEY_NAME = "name";//姓名private static final String KEY_PHONE = "phone";//电话号码private static final String KEY_EMAIL = "email";//邮箱private static final String KEY_ADDRESS = "address";//联系人地址private static final String KEY_SMS_HEADER = "sms_header";private static final String KEY_SMS_CONTENT = "sms_content";private static final String KEY_CONTACT_ID = "contact_id";private static final String KEY_SMS_TYPE = "sms_type";private static final String CONTACTS_TABLE_CREATE ="CREATE TABLE " + CONTACTS_TABLE + " (" + KEY_ID + " INTEGER PRIMARY KEY, " + KEY_IMAGE + " BLOB, " + KEY_NAME + " TEXT, " + KEY_PHONE + " TEXT, " +KEY_EMAIL + " TEXT, " + KEY_ADDRESS + " TEXT)";private static final String SMS_TABLE_CREATE ="CREATE TABLE " + SMS_TABLE + " (" + KEY_ID + " INTEGER PRIMARY KEY, " +KEY_SMS_HEADER + " TEXT, " + KEY_SMS_CONTENT + " TEXT, " +KEY_CONTACT_ID + " INTEGER," + KEY_SMS_TYPE + " INTEGER)";private static DBHandler dbInstance= null;public static DBHandlergetInstance(Context context) {if (dbInstance== null) {dbInstance= new DBHandler(context, DB_NAME, DB_VERSION);}return dbInstance;}DBHandler(Context context, String dbName, int dbVersion) {super(context, dbName, null, dbVersion);}@Overridepublic void onCreate(SQLiteDatabasedb) {db.execSQL(CONTACTS_TABLE_CREATE);db.execSQL(SMS_TABLE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabasedb, int oldVersion, int newVersion) {// Drop older table if existeddb.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE);db.execSQL("DROP TABLE IF EXISTS " + SMS_TABLE);// 重新创建表onCreate(db);}//新增联系人public void addContact(Contact contact) {SQLiteDatabasedb = this.getWritableDatabase();ContentValues values = new ContentValues();values.put(KEY_IMAGE, contact.getImage());values.put(KEY_NAME, contact.getName());values.put(KEY_PHONE, contact.getPhone());values.put(KEY_EMAIL, contact.getEmail());values.put(KEY_ADDRESS, contact.getAddress());db.insert(CONTACTS_TABLE, null, values);}// Adding new smspublic void addSms(Smssms) {SQLiteDatabasedb = this.getWritableDatabase();ContentValues values = new ContentValues();values.put(KEY_SMS_HEADER, sms.getHeader());values.put(KEY_SMS_CONTENT, sms.getContent());values.put(KEY_CONTACT_ID, sms.getContactId());values.put(KEY_SMS_TYPE, sms.getType());db.insert(SMS_TABLE, null, values);}// Getting one contactpublic Contact getContact(int id) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(CONTACTS_TABLE, new String[]{ KEY_ID, KEY_IMAGE, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS }, KEY_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null);if (cursor != null)cursor.moveToFirst();Contact contact = new Contact(cursor.getBlob(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5));contact.setId(cursor.getInt(0));cursor.close();return contact;}// Getting one contact by namepublic Contact getContactByName(String name) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(CONTACTS_TABLE, new String[]{ KEY_ID, KEY_IMAGE, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS }, KEY_NAME + "=?", new String[] { name }, null, null, null, null);if (cursor != null)cursor.moveToFirst();Contact contact = new Contact(cursor.getBlob(1), cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5));contact.setId(cursor.getInt(0));cursor.close();return contact;}// Getting one contact by phonepublic Contact getContactByPhone(String phone) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(CONTACTS_TABLE, new String[]{ KEY_ID, KEY_IMAGE, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS }, KEY_PHONE + "=?", new String[] { phone }, null, null, null, null);if (!cursor.moveToFirst())return null;Contact contact = new Contact(cursor.getBlob(1), cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5));contact.setId(cursor.getInt(0));cursor.close();return contact;}// Getting one sms by contact idpublic List<Sms>getSmsByContactId(Integer id) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(SMS_TABLE, new String[]{ KEY_ID, KEY_SMS_HEADER, KEY_SMS_CONTENT, KEY_CONTACT_ID,KEY_SMS_TYPE },KEY_CONTACT_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null);List<Sms>allSms = new ArrayList<>();if (cursor.moveToFirst()) {do {Smssms = new Sms();sms.setId(Integer.parseInt(cursor.getString(0)));sms.setHeader(cursor.getString(1));sms.setContent(cursor.getString(2));sms.setContactId(cursor.getInt(3));sms.setType(cursor.getInt(4));allSms.add(sms);} while (cursor.moveToNext());}cursor.close();return allSms;}// Getting all contactspublic List<Contact>getAllContacts() {String selectQuery = "SELECT * FROM " + CONTACTS_TABLE; SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);List<Contact>allContacts = new ArrayList<>();if (cursor.moveToFirst()) {do {Contact contact = new Contact();contact.setId(Integer.parseInt(cursor.getString(0)));contact.setImage(cursor.getBlob(1));contact.setName(cursor.getString(2));contact.setPhone(cursor.getString(3));contact.setEmail(cursor.getString(4));contact.setAddress(cursor.getString(5));allContacts.add(contact);} while (cursor.moveToNext());}cursor.close();return allContacts;}// Getting all smspublic List<Sms>getAllSms() {String selectQuery = "SELECT * FROM " + SMS_TABLE; SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);List<Sms>allSms = new ArrayList<>();if (cursor.moveToFirst()) {do {Smssms = new Sms();sms.setId(Integer.parseInt(cursor.getString(0)));sms.setHeader(cursor.getString(1));sms.setContent(cursor.getString(2));sms.setContactId(cursor.getInt(3));sms.setType(cursor.getInt(4));allSms.add(sms);} while (cursor.moveToNext());}cursor.close();return allSms;}// Getting all sms from contactpublic List<Sms>getAllSmsFromContact(int id) {String selectQuery = "SELECT * FROM " + SMS_TABLE + " WHERE " + KEY_CONTACT_ID + " = " + id;SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);List<Sms>allSms = new ArrayList<>();if (cursor.moveToFirst()) {do {Smssms = new Sms();sms.setId(Integer.parseInt(cursor.getString(0)));sms.setHeader(cursor.getString(1));sms.setContent(cursor.getString(2));sms.setContactId(cursor.getInt(3));sms.setType(cursor.getInt(4));allSms.add(sms);} while (cursor.moveToNext());}cursor.close();return allSms;}// Getting contacts countpublic Integer getContactsCount() {String countQuery = "SELECT * FROM " + CONTACTS_TABLE; SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(countQuery, null);return cursor.getCount();}// Checking duplicates in tablepublic boolean isDuplicate(DBHandlerdb, String name) {List<Contact> contacts = db.getAllContacts();for (Contact cont : contacts) {if (cont.getName().equals(name))return true;}return false;}// Updating a contactpublic Integer updateContact(Contact contact) {SQLiteDatabasedb = this.getWritableDatabase();ContentValues values = new ContentValues();values.put(KEY_IMAGE, contact.getImage());values.put(KEY_NAME, contact.getName());values.put(KEY_PHONE, contact.getPhone());values.put(KEY_EMAIL, contact.getEmail());values.put(KEY_ADDRESS, contact.getAddress());return db.update(CONTACTS_TABLE, values, KEY_ID + " = ?", new String[]{String.valueOf(contact.getId())});}// Updating a smspublic Integer updateSms(Smssms) {SQLiteDatabasedb = this.getWritableDatabase(); ContentValues values = new ContentValues();values.put(KEY_SMS_HEADER, sms.getHeader());values.put(KEY_SMS_CONTENT, sms.getContent());values.put(KEY_CONTACT_ID, sms.getContactId());values.put(KEY_SMS_TYPE, sms.getType());return db.update(SMS_TABLE, values, KEY_ID + " = ?",new String[]{String.valueOf(sms.getId())});}// Deleting a contactpublic void deleteContact(Contact contact) { SQLiteDatabasedb = this.getWritableDatabase();db.delete(CONTACTS_TABLE, KEY_ID + " = ?",new String[] { String.valueOf(contact.getId()) });}// Deleting a contactpublic void deleteSms(Smssms) {SQLiteDatabasedb = this.getWritableDatabase();db.delete(SMS_TABLE, KEY_ID + " = ?",new String[] { String.valueOf(sms.getId()) });}// Deleting all contactspublic void deleteAllContacts(DBHandlerdb) {List<Contact> contacts = db.getAllContacts();for (Contact cont : contacts) {db.deleteContact(cont);}}// Deleting all smspublic void deleteAllSms(DBHandlerdb) {List<Sms>allSms = db.getAllSms();for (Smssms : allSms) {db.deleteSms(sms);}}}界面切换:package com.example.hivian.my_contact_manager.views.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.WindowManager;import com.example.hivian.my_contact_manager.R;import java.util.Timer;import java.util.TimerTask;public class SplashActivity extends Activity {private static final long DELAY = 1000;private boolean scheduled = false;private Timer splashTimer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_splash);this.getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);splashTimer= new Timer();splashTimer.schedule(new TimerTask(){@Overridepublic void run(){Intent intent = new Intent(SplashActivity.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);startActivity(intent);overridePendingTransition(0, 0);SplashActivity.this.finish();}}, DELAY);scheduled = true;}@Overrideprotected void onDestroy() {super.onDestroy();if (scheduled) {splashTimer.cancel();}splashTimer.purge();}}按钮设计:package com.example.hivian.my_contact_manager.views.fragments; import android.Manifest;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.Color;import android.graphics.Typeface;import .Uri;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.content.ContextCompat;import android.support.v4.content.res.ResourcesCompat;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.util.TypedValue;import youtInflater;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ScrollView;import android.widget.TextView;import android.widget.Toast;import android.support.v4.app.Fragment;import com.example.hivian.my_contact_manager.R;import com.example.hivian.my_contact_manager.models.Contact;import com.example.hivian.my_contact_manager.models.Sms;import com.example.hivian.my_contact_manager.models.db.DBHandler;import com.example.hivian.my_contact_manager.utilities.BitmapUtility;import com.example.hivian.my_contact_manager.views.activities.ContactEditionActivity; import com.example.hivian.my_contact_manager.views.activities.ContactSmsActivity;import com.example.hivian.my_contact_manager.views.activities.MainActivity;import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;import java.util.List;public class ContactInfoFragment extends Fragment implements View.OnClickListener, View.OnTouchListener {private TextView name;private TextView phone;public FloatingActionMenu actionMenu;private DBHandler db;@Nullable@Overridepublic View onCreateView(LayoutInflaterinflater, @Nullable ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(yout.fragment_contact_info, container, false);setHasOptionsMenu(true);ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar();if (ab != null) {ab.setTitle("Options");ab.setDisplayHomeAsUpEnabled(true);}db= DBHandler.getInstance(getActivity());Contact receivedContact = (Contact) getArguments().getSerializable("contact");if (receivedContact != null) {ImageViewimageView = (ImageView) view.findViewById(_image);name = (TextView) view.findViewById(_name);phone = (TextView) view.findViewById(_phone);TextView email = (TextView) view.findViewById(_email);TextView address = (TextView) view.findViewById(_address);if (receivedContact.getImage() != null) {Bitmap imageBm = BitmapUtility.getImage(receivedContact.getImage());imageView.setImageBitmap(imageBm);}name.setText(receivedContact.getName());phone.setText(receivedContact.getPhone());if (receivedContact.getEmail().equals("")) {email.setTypeface(null, Typeface.ITALIC);email.setTextColor(Color.GRAY);email.setTextSize(PLEX_UNIT_DIP, 18f);email.setText(R.string.placeholder_none);}elseemail.setText(receivedContact.getEmail());if (receivedContact.getAddress().equals("")) {address.setTypeface(null, Typeface.ITALIC);address.setTextColor(Color.GRAY);address.setTextSize(PLEX_UNIT_DIP, 18f);address.setText(R.string.placeholder_none);}elseaddress.setText(receivedContact.getAddress());}return view;}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) { initInfoMenu(view);ScrollViewscrollView = (ScrollView) view.findViewById(R.id.scrollview_contact_info); scrollView.setOnTouchListener(this);super.onViewCreated(view, savedInstanceState);}@Overridepublic boolean onTouch(View v, MotionEvent event) {actionMenu.close(true);return false;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.itemId1:toSmsManager();break;case R.id.itemId2:callContact();break;case R.id.itemId3:editContact();break;case R.id.itemId4:deleteContact();break;}actionMenu.close(true);}@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflaterinflater) {inflater.inflate(R.menu.menu_main, menu);super.onCreateOptionsMenu(menu,inflater);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:actionMenu.close(true);getFragmentManager().popBackStack();return true;default:return super.onOptionsItemSelected(item);}}private void initInfoMenu(View view) {ImageView menuIcon1 = new ImageView(getActivity());ImageView menuIcon2 = new ImageView(getActivity());ImageView menuIcon3 = new ImageView(getActivity());ImageView menuIcon4 = new ImageView(getActivity());menuIcon1.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_message_black_24dp, null));menuIcon2.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_call_black_24dp, null));menuIcon3.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_mode_edit_black_24dp, null));menuIcon4.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_delete_black_24dp, null));menuIcon1.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.circle_opacity, null));menuIcon2.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.circle_opacity, null));menuIcon3.setBackground(ResourcesCompat.getDrawable(getResources(),R.drawable.circle_opacity, null));menuIcon4.setBackground(ResourcesCompat.getDrawable(getResources(),R.drawable.circle_opacity, null));menuIcon1.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon2.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon3.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon4.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon1.setPadding(15,15,15,15);menuIcon2.setPadding(15,15,15,15);menuIcon3.setPadding(15,15,15,15); //设置的是各个控件之间的距离menuIcon4.setPadding(15,15,15,15);SubActionButton.BuilderitemBuilder = new SubActionButton.Builder(getActivity()); itemBuilder.setLayoutParams(new youtParams(160,160));ImageViewmenuInfo = (ImageView) view.findViewById(_menu);actionMenu= new FloatingActionMenu.Builder(getActivity()).addSubActionView(itemBuilder.setContentView(menuIcon1).build()) .addSubActionView(itemBuilder.setContentView(menuIcon2).build()) .addSubActionView(itemBuilder.setContentView(menuIcon3).build()) .addSubActionView(itemBuilder.setContentView(menuIcon4).build()) .attachTo(menuInfo).setStartAngle(100).setEndAngle(260).build();menuIcon1.setId(R.id.itemId1);menuIcon1.setOnClickListener(this);menuIcon2.setId(R.id.itemId2);menuIcon2.setOnClickListener(this);menuIcon3.setId(R.id.itemId3);menuIcon3.setOnClickListener(this);menuIcon4.setId(R.id.itemId4);menuIcon4.setOnClickListener(this);}private void toSmsManager() {name = (TextView) getActivity().findViewById(_name);phone = (TextView) getActivity().findViewById(_phone);Intent intent = new Intent(getActivity(), ContactSmsActivity.class);intent.putExtra("name", name.getText().toString());intent.putExtra("phone", phone.getText().toString());startActivity(intent);}private void callContact() {phone = (TextView) getActivity().findViewById(_phone);Intent callIntent = new Intent(Intent.ACTION_CALL);callIntent.setData(Uri.parse("tel:" + phone.getText().toString()));if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {startActivity(callIntent);} else {Toast toast = Toast.makeText(getActivity(), R.string.alert_no_call_perm, Toast.LENGTH_LONG);toast.show();}}private void editContact() {name = (TextView) getActivity().findViewById(_name);Contact contact = db.getContactByName(name.getText().toString());Intent intent = new Intent(getActivity(), ContactEditionActivity.class);intent.putExtra("contact", contact);startActivity(intent);}private void deleteContact() {AlertDialog dialog = new AlertDialog.Builder(getActivity()).setMessage(getResources().getString(R.string.alert_delete_message)).setCancelable(false).setPositiveButton(getResources().getString(R.string.alert_delete_ok),new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {TextViewtextView = (TextView) getActivity().findViewById(_name);Contact contact =db.getContactByName(textView.getText().toString());db.deleteContact(contact);List<Sms>allSms = db.getAllSmsFromContact(contact.getId());for (Smssms : allSms) {db.deleteSms(sms);}Intent intent = new Intent(getActivity(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);}}).setNegativeButton(getResources().getString(R.string.alert_delete_cancel), null).show();Button buttonPositive = dialog.getButton(DialogInterface.BUTTON_POSITIVE);Button buttonNegative = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);buttonPositive.setTextColor(ContextCompat.getColor(getActivity(),R.color.colorPrimary));buttonNegative.setTextColor(ContextCompat.getColor(getActivity(),R.color.colorPrimary));}}Main程序:package com.example.hivian.my_contact_manager.views.activities;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import com.example.hivian.my_contact_manager.R;import com.example.hivian.my_contact_manager.models.Contact;import com.example.hivian.my_contact_manager.utilities.Utility;import com.example.hivian.my_contact_manager.views.fragments.ContactInfoFragment;import com.example.hivian.my_contact_manager.views.fragments.ContactListFragment;public class MainActivity extends AppCompatActivity implementsContactListFragment.DataPassListener {private ContactListFragment fragmentA;private ContactInfoFragment fragmentB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main_activity);if (findViewById(R.id.fragment_holder) != null) {Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);if (savedInstanceState != null) {fragmentA= new ContactListFragment();fragmentB= new ContactInfoFragment();return;}fragmentA= new ContactListFragment();fragmentB= new ContactInfoFragment();getSupportFragmentManager().beginTransaction().add(R.id.fragment_holder, fragmentA).commit();Utility.changeStatusBarColor(this);}}@Overridepublic void onBackPressed() {int count = getSupportFragmentManager().getBackStackEntryCount();if (count == 0) {super.onBackPressed();} else {if (fragmentB.actionMenu!= null) {fragmentB.actionMenu.close(true);}getSupportFragmentManager().popBackStack();}}@Overridepublic void passData(Contact contact) {if (fragmentB!= null) {Bundle args = new Bundle();args.putSerializable("contact", contact);fragmentB.setArguments(args);getSupportFragmentManager().beginTransaction().setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right).replace(R.id.fragment_holder, fragmentB).addToBackStack(null)五、实验数据(现象)处理分析下面是程序的截图:软件界面以及各个自文件目录示意图:通讯录在Android手机功能界面上的显示图标以及图标在工程里存放的位置:进入通讯录时的初界面以及图标的配置过程:刚开始运行通讯录时,出现几个权限选择:开始界面(按加号):创建一个新的联系人:会弹出键盘创建联系人的过程中如果格式不规范会有错误提示:比如Email格式错误创建好后的界面(多创建几个联系人),头像可以更改:修改头像时出现的错误如下(照相机和相册里选择合适的头像):接下来进行对通讯录的基本功能测试。

Android自定义TextView实现文本内容自动调整字体大小

Android自定义TextView实现文本内容自动调整字体大小

Android⾃定义TextView实现⽂本内容⾃动调整字体⼤⼩最近做通讯录⼩屏机联系⼈姓名显⽰--长度超过边界字体变⼩/*** ⾃定义TextView,⽂本内容⾃动调整字体⼤⼩以适应TextView的⼤⼩* @author yzp*/public class AutoFitTextView extends TextView {private Paint mTextPaint;private float mTextSize;public AutoFitTextView(Context context) {super(context);}public AutoFitTextView(Context context, AttributeSet attrs) {super(context, attrs);}/*** Re size the font so the specified text fits in the text box assuming the* text box is the specified width.** @param text* @param textWidth*/private void refitText(String text, int textViewWidth) {if (text == null || textViewWidth <= 0)return;mTextPaint = new Paint();mTextPaint.set(this.getPaint());int availableTextViewWidth = getWidth() - getPaddingLeft() - getPaddingRight();float[] charsWidthArr = new float[text.length()];Rect boundsRect = new Rect();mTextPaint.getTextBounds(text, 0, text.length(), boundsRect);int textWidth = boundsRect.width();mTextSize = getTextSize();while (textWidth > availableTextViewWidth) {mTextSize -= 1;mTextPaint.setTextSize(mTextSize);textWidth = mTextPaint.getTextWidths(text, charsWidthArr);}this.setTextSize(PLEX_UNIT_PX, mTextSize);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);refitText(this.getText().toString(), this.getWidth());}}以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,同时也希望多多⽀持!。

Android手机通讯录(源码)

Android手机通讯录(源码)

Android⼿机通讯录(源码) 简易⼿机通讯录⼀:功能模块 1.主界⾯,通过listview 展⽰所有联系⼈信息,并在没有联系⼈时给出友好提⽰ 2.主界⾯.显⽰最近查看的某个联系⼈信息 3.主界⾯,可以长按某联系⼈项,弹出菜单,删除该联系⼈;删除联系⼈后,在⼿机通知栏弹出信息给⽤户提⽰ 4.主界⾯选择分组,可以查看所有联系⼈,也可以只查看某⼀分组的联系⼈ 5.点击主界⾯的某联系⼈,可以进⼊联系⼈详情界⾯,查看联系⼈各详细信息,并可修改联系⼈各信息; 联系⼈的性别和所在分组可通过下拉菜单选择;长按电话号码,可以进⼊拨打电话功能; 修改联系⼈信息后,跳转回到主界⾯,并使⽤Toast给予⽤户提⽰ 6.主界⾯菜单栏可以添加新联系⼈,关于等功能 7.能在联系⼈详情界⾯,动态增加多个联系电话,并储存到数据库中效果图展⽰:源码下载地址:项⽬回顾: 1.scrollview嵌套listview产⽣的滑动冲突(recyclerview) 解决⽅案:listView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_UP){//点击listview⾥⾯滚动停⽌时,scrollview拦截listview的触屏事件,就是scrollview该滚动了scrollView.requestDisallowInterceptTouchEvent(false);}else{//当listview在滚动时,不拦截listview的滚动事件;就是listview可以滚动,scrollView.requestDisallowInterceptTouchEvent(true);}return false;}}); 2.关于listview 中 EditText 监听//1.在设置text前,先移除监听if (viewHodler.number.getTag() instanceof TextWatcher) {viewHodler.number.removeTextChangedListener((TextWatcher) viewHodler.number.getTag());}if (TextUtils.isEmpty(phoneNumber.getNumber())){viewHodler.number.setText("");}else {viewHodler.number.setText(phoneNumber.getNumber());}//2.新建监听类TextWatcher watcher = new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {if (TextUtils.isEmpty(s)) {phoneNumber.setNumber(null);finalViewHodler.imageView.setVisibility(View.GONE);} else {phoneNumber.setNumber(s.toString());finalViewHodler.imageView.setVisibility(View.VISIBLE);}Log.e("tag", "afterTextChanged: " +s.toString() );}};//3.添加监听器viewHodler.number.addTextChangedListener(watcher);viewHodler.number.setTag(watcher); 3.获取listview 中所有 Editext 的值 思路:在适配器中创建HashMap 在getview()⽅法中保存所有的Editext key = position value = editext 然后在通过HashMap 获取就⾏了private HashMap<Integer,EditText> edMap;@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {PhoneAdapter.ViewHodler viewHodler = null;if (convertView == null) {viewHodler = new PhoneAdapter.ViewHodler();convertView = LayoutInflater.from(context).inflate(yout.phone_list_item, null, false);viewHodler.spinner = convertView.findViewById(R.id.pnone_spinner);viewHodler.number = convertView.findViewById(R.id.pnone_number);viewHodler.imageView = convertView.findViewById(R.id.imageView4);//put 保存edMap.put(position,viewHodler.number);spMap.put(position,viewHodler.spinner);convertView.setTag(viewHodler);} else {viewHodler = (PhoneAdapter.ViewHodler) convertView.getTag();edMap.put(position,viewHodler.number);spMap.put(position,viewHodler.spinner);} 4.拨打电话功能的坑public void call(String telPhone){if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){//要在telPhone前加上字符串tel:Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + telPhone));startActivity(intent);}} 不让你就会见到下图:。

安卓系统手机通讯录的设计与实现_李宁

安卓系统手机通讯录的设计与实现_李宁

第34卷第4期 辽宁工业大学学报(自然科学版) V ol.34, No.42014年 8 月 Journal of Liaoning University of Technology(Natural Science Edition) Aug.2014收稿日期:2014-02-12基金项目:辽宁省自然科学基金项目(201302022)作者简介:李宁(1979-),女(满族),山东掖县人,讲师,硕士。

本刊核心层次论文安卓系统手机通讯录的设计与实现李 宁,朱清昃,王冬霞(辽宁工业大学 电子与信息工程学院,辽宁 锦州 121001)摘 要:基于安卓系统开发手机通讯录,采用Eclipse+Android+sdk 集成开发环境,运用Java 语言编程。

通过调用系统资源,获取多种服务以及对应的方法,如LocationManager 、SmsManager 等;运用XML 配置文件静态生成用户UI 界面和注册系统应用权限;另外,程序添加了GPS 模块,通过对GPS 设备监听获取用户地理位置信息,实现发送应急短信的功能。

经过测试,该模块可在室外实现用户定位,并且能够监听应急短信的发送和接收状态。

关键词:手机通讯录;安卓系统;Java ;GPS中图分类号:TP311 文献标识码:A 文章编号:1674-3261(2014)04-0211-05Design and Implementation of Mobile Phone Directoryfor Android SystemLI Ning, ZHU Qing-ze, WANG Dong-xia(Electronics & Information Engineering College, Liaoning University of Technology, Jinzhou 121001, China )Abstract: Mobile phone directory based on the Android system was designed, which used the Eclipse+Android+sdk integrated development environment and the Java programming language. Through the usage of the Android system resources, a variety of services and the corresponding methods were accessed, such as LocationManager, SmsManager and so on; the XML configuration file was used to generate static UI user interface and registration system application authority. In addition, the GPS module was added in the design, and the GPS device which was used for the function of sending emergency SMS monitored the user location information. After testing, the module could locate the user outdoor, and monitor the state of emergency SMS sending and receiving.Key words: mobile phone directory; Android system; Java; GPS安卓系统是基于Linux 平台的开放源代码的手机操作系统,该平台由操作系统、中间件、用户界面和应用软件组成。

Android手机电话薄的设计与实现毕业论文

Android手机电话薄的设计与实现毕业论文

本科生毕业论文(申请学士学位)论文题目Android手机通讯录的设计与实现目录摘要 (1)Abstract (1)1绪论 (2)1.1研究背景 (2)1.2 研究方向 (2)1.3前景优势 (3)1.4主要工作和方法 (4)1.5本文结构 (4)2 课题相关技术与理论 (4)2.1Android系统开发简介 (4)2.1.1Android技术简介 (4)2.1.2 Android架构 (6)2.1.3 关键应用程序 (7)2.1.4 应用程序框架 (7)2.1.5 C/C++函数库 (7)2.1.6 Java程序运行环境 (7)2.1.7 Linux内核 (8)2.2 Android应用的构成和工作机制 (8)2.2.1 Activity (8)2.2.2 Intent Receiver (9)2.2.3 Service (9)2.2.4 Content Provider (9)2.3 Android开发平台搭建 (10)3 系统需求分析 (10)3.1业务功能需求分析 (10)3.2 性能需求分析 (11)3.3安全需求 (12)4 系统总体设计 (12)4.1 开发流程和系统数据流图 (12)4.2 详细功能分析 (13)4.3系统模块划分 (14)4.4系统界面绘制 (14)4.5程序设计 (17)4.5.1数据库结构设计 (17)4.5.2menu按键主菜单的建立 (21)4.5.3详细的页面添加设计 (22)4.5.4其他功能设计 (24)5系统测试 (26)5.1测试过程 (26)5.2测试目的 (29)5.3测试方法和工具 (29)参考文献 (30)致谢 (31)Android手机通讯录的设计与实现摘要:随着第三代通信技术3G的推广,无线带宽和传输速度都得到了大幅提升。

为智能手机终端添加更多内容丰富的应用功能提供了良好的平台。

本课题采用谷歌公司新推出的一款基于Linux平台的开源手机操作系统——Android系统,利用Java语言,Eclipse为开发工具对通讯录的代码进行编写。

软件工程毕业设计_基于android系统的同学录的实现

软件工程毕业设计_基于android系统的同学录的实现

河北农业大学本科毕业论文(设计)题目:基于Android系统的同学录的实现摘要随着第三代通信技术3G的推广,无线带宽和传输速度都得到了大幅度提升,为智能手机终端添加更多内容丰富的应用功能提供了良好的平台。

本系统是基于谷歌公司新推出的一款Linux平台的开源手机操作系统——Android系统,利用Java语言,Eclipse为开发工具,通过对平台的系统架构和应用程序进行学习,设计出一款手机通讯录。

本系统包括存储,删除,Android修改,打电话,发信息,发邮件,备份SD卡等功能,满足了用户对通讯录的需求。

此通讯录的设计遵循标准的开发流程,首先进行需求分析,然后确定通讯录的功能,再编写程序的代码,调试程序,运行程序,并对程序进行优化完善。

关键词:Android;手机通讯录;智能手机;JAVAAbstractWith the 3G promotion of third-generation communications technology, wireless bandwidth and transmission speed have been improved significantly, and provides a good platform for smart mobile terminals to add more content-rich applications. The design is based on the Google Corporation a new version of the Linux platform to the source mobile phone operating system -- Android system, using Java language, Eclipse as a development tool, through the Android platform system architecture and application for research, design a mobile phone contacts. The design including functions of storage, deletion, modification, phone calls, messages sending, E-mail sending, backup SD cards and other functions, to meet user demand for mail list. The design of the contacts follows the standard development process, the first needs analysis, and then determine the function of the contacts, then write the code, the debugger, run the program, and procedures to optimize the sound.Key words: Android; Mobile Phone Contacts; Smartphone;Java目录1绪论 (1)1.1研究背景 (1)1.2研究现状 (1)1.3主要工作 (3)2 ANDROID技术与理论 (4)2.1A NDROID系统开发简介 (4)2.1.1 Android技术简介 (4)2.1.2 关键应用程序 (6)2.1.3 应用程序框架 (6)2.1.4 函数库 (6)2.1.5 Linux内核 (6)2.2A NDROID应用的构成和工作机制 (7)2.2.1 Activity (7)2.2.2 Intent Receiver (7)2.2.3 Service (8)2.2.4 Content Provider (8)3需求分析 (9)3.1功能需求分析 (9)3.2性能需求分析 (10)3.3数据库需求分析 (10)3.4安全需求 (11)4功能设计 (12)4.1总体设计 (12)4.2系统功能设计 (13)4.3系统数据库设计 (14)5通讯录实现 (16)5.1A NDROID开发平台搭建 (16)5.2具体功能实现 (16)5.2.1界面布局 (16)5.2.2增加联系人功能 (17)5.2.3查找联系人功能 (18)5.2.4数据库操作实现 (19)5.3系统功能截图 (21)参考文献 (25)致谢 (26)1绪论1.1研究背景智能手机(Smartphone),是指“像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称”。

自定义view的基本流程

自定义view的基本流程

自定义view的基本流程1.自定义View的意义自定义View是开发Android应用的常见需求,它可以实现各种特殊的UI效果和交互效果。

有时候,自带的一些View无法满足我们的需求,而自定义一个View可以帮助我们实现想要的效果。

2.自定义View的基本流程要实现一个自定义View,通常需要经过以下基本流程:2.1创建自定义View类首先,我们需要创建一个自定义View的类,并继承自View或其子类,比如ImageView、TextView等。

在类中,我们可以重写onMeasure()、onLayout()和onDraw()等方法来实现自定义View的特殊行为。

2.2声明自定义View的属性如果我们希望在XML布局文件中使用自定义View,并可以在代码中设置属性值,就需要在类中声明自定义属性。

这可以通过在res/values/attrs.xml文件中定义属性集合来实现。

2.3实现自定义View的布局在onMeasure()方法中,我们可以指定自定义View在测量时占用的空间大小。

在onLayout()方法中,我们可以指定子View的位置。

2.4实现自定义View的绘制在onDraw()方法中,我们可以通过调用Canvas的API来实现自定义View的绘制效果。

例如,我们可以通过Path绘制自定义的图形,通过Paint设置绘制时的样式和颜色等。

2.5对自定义View进行测试最后,我们需要通过手动测试、单元测试、自动化UI测试等方式,对自定义View进行测试和验证。

3.自定义View的实例以下是一个简单的自定义View实例,用于显示一个可以按下和弹起的按钮:```public class MyButton extends View{private boolean isPressed=false;public MyButton(Context context){super(context);}public MyButton(Context context,AttributeSet attrs) {super(context,attrs);}@Overrideprotected void onDraw(Canvas canvas){super.onDraw(canvas);Paint paint=new Paint();paint.setColor(isPressed?Color.RED:Color.GREEN);canvas.drawRect(0,0,getWidth(),getHeight(), paint);}@Overridepublic boolean onTouchEvent(MotionEvent event){if(event.getAction()==MotionEvent.ACTION_DOWN) {isPressed=true;invalidate();return true;}else if(event.getAction()==MotionEvent.ACTION_UP){isPressed=false;invalidate();return true;}return super.onTouchEvent(event);}}```以上代码中,我们实现了一个MyButton类,当MyButton被按下时,它的背景颜色会变成红色,当MyButton被弹起时,它的背景颜色会回到绿色。

基于android的手机通讯录的设计与实现

基于android的手机通讯录的设计与实现
华东交通大学理工学院
Institute ofTechnology.
EastChinaJiaotongUniversity
毕 业 设 计
GraduationDesign
(2009—2013年)
题 目基于android的手机通讯录的设计与实现
分 院:电气与信息工程分院
专 业:计算机科学与技术
班 级:计科 2009—2
3.1 功能需求分析………………………………………………………………11
3.2 性能需求分析………………………………………………………………12
3.3 数据库需求分析……………………………………………………………12
4通讯录应用的功能设计…………………………………………………………13
4.1 总体设计……………………………………………………………………13
(保密的毕业设计在解密后适用本授权书)
毕业设计作者签名: 指导教师签名:
签字日期: 年 月 日 签字日期: 年 月 日
摘 要
随着移动设备制造技术和移动通信网络的迅猛发展,全球手机用户日益增加,手机成为了很多人日常生活中必不可少的一部分,手机业在日益发展的同时,人们对手机的功能需求和体验需求也越来越高,因此各种智能手机相继而出,当前市场上最流行的智能手机的操作系统非Android莫属。Android是由谷歌公司于2007年11月推出,并很快得到了手机制造商的认可和广大用户的好评。本文以Android系统中的手机通讯录模块为项目背景,利用Java语言,Eclipse为开发工具,主要是对通讯录的版面设计和功能设计的研究,尽可能设计出更具实用性的通讯录程序,本系统包括基本的增加联系人﹑删除联系人﹑查找联系人﹑菜单﹑退出功能,其中菜单包括显示所有﹑删除所有﹑号码备份功能,使通讯录更能切合用户的需求。该通讯录的设计严格按照开发的流程进行。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android自定义View之Android手机通讯录制作我们的手机通讯录一般都有这样的效果,如下图:OK,这种效果大家都见得多了,基本上所有的Android手机通讯录都有这样的效果。

那我们今天就来看看这个效果该怎么实现。

一.概述1.页面功能分析整体上来说,左边是一个ListView,右边是一个自定义View,但是左边的ListView 和我们平常使用的ListView还有一点点不同,就是在ListView中我对所有的联系人进行了分组,那么这种效果的实现最常见的就是两种思路:1.使用ExpandableListView来实现这种分组效果2.使用普通ListView,在构造Adapter时实现SectionIndexer接口,然后在Adapter 中做相应的处理这两种方式都不难,都属于普通控件的使用,那么这里我们使用第二种方式来实现,第一种方式的实现方法大家可以自行研究,如果你还不熟悉ExpandableListView的使用,可以参考我的另外两篇博客:1.使用ExpandableListView实现一个时光轴2.android开发之ExpandableListView的使用,实现类似QQ好友列表OK,这是我们左边ListView的实现思路,右边这个东东就是我们今天的主角,这里我通过自定义一个View来实现,View中的A、B......#这些字符我都通过canvas的drawText 方法绘制上去。

然后重写onTouchEvent方法来实现事件监听。

2.要实现的效果要实现的效果如上图所示,但是大家看图片有些地方可能还不太清楚,所以这里我再强调一下:1.左边的ListView对数据进行分组显示2.当左边ListView滑动的时候,右边滑动控件中的文字颜色能够跟随左边ListView 的滑动自动变化3.当手指在右边的滑动控件上滑动时,手指滑动到的地方的文字颜色应当发生变化,同时在整个页面的正中央有一个TextView显示手指目前按下的文字4.当手指按下右边的滑动控件时,右边的滑动控件背景变为灰色,手指松开后,右边的滑动控件又变为透明色二.左边ListView分组效果的实现无论多大的工程,我们都要将之分解为一个个细小的功能块分步来实现,那么这里我们就先来看看左边的ListView的分组的实现,这个效果实现之后,我们再来看看右边的滑动控件该怎么实现。

首先我需要在布局文件中添加一个ListView,这个很简单,和普通的ListView一模一样,我就不贴代码了,另外,针对ListView中的数据集,我需要自建一个实体类,该实体类如下:/*** Created by wangsong on 2016/4/24.*/public class User {private intimg;private String username;private String pinyin;private String firstLetter;public User() {}public String getFirstLetter() {return firstLetter;}public void setFirstLetter(String firstLetter) { this.firstLetter = firstLetter;}public intgetImg() {return img;}public void setImg(intimg) {this.img = img;}public String getPinyin() {return pinyin;public void setPinyin(String pinyin) {this.pinyin = pinyin;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public User(String firstLetter, intimg, String pinyin, String username) { this.firstLetter = firstLetter;this.img = img;this.pinyin = pinyin;ername = username;}username 用来存储用户名,img表示用户图像的资源id(这里我没有准备相应的图片,大家有兴趣可以自行添加),pinyin表示用户姓名的拼音,firstLetter表示用户姓名拼音的首字母,OK ,就这么简单的几个属性。

至于数据源,我在strings.xml文件中添加了许多数据,这里就不贴出来了,大家可以直接在文末下载源码看。

知道了数据源,知道了实体类,我们来看看在MainActivity中怎么样来初始化数据:private void initData() {list = new ArrayList<>();String[] allUserNames = getResources().getStringArray(R.array.arrUsernames);for (String allUserName :allUserNames) {User user = new User();user.setUsername(allUserName);String convert =ChineseToPinyinHelper.getInstance().getPinyin(allUserName).toUpperCase();user.setPinyin(convert);String substring = convert.substring(0, 1);if (substring.matches("[A-Z]")) {user.setFirstLetter(substring);user.setFirstLetter("#");}list.add(user);}Collections.sort(list, new Comparator<User>() {@Overridepublic intcompare(User lhs, User rhs) {if (lhs.getFirstLetter().contains("#")) {return 1;} else if (rhs.getFirstLetter().contains("#")) { return -1;}else{returnlhs.getFirstLetter().compareTo(rhs.getFirstLetter());}}});}首先创建一个List集合用来存放所有的数据,然后从strings.xml文件中读取出来所有的数据,遍历数据然后存储到List集合中,在遍历的过程中,我通过ChineseToPinyinHelper 这个工具类来将中文转为拼音,然后截取拼音的第一个字母,如果该字母是A~Z,那么直接设置给 user对象的firstLetter属性,否则user对象的firstLetter属性为一个#,这是由于我的数据源中有一些不是以汉字开头的姓名,而是以其他字符开头的姓名,那么我将这些统一归为#这个分组。

OK,数据源构造好之后,我还需要对List集合进行一个简单的排序,那么这个排序是Java中的操作,我这里就不再赘述。

构造完数据源之后,接着就该是构造ListView的Adapter了,我们来看看这个怎么做,先来看看源码:/*** Created by wangsong on 2016/4/24.*/public class MyAdapter extends BaseAdapter implements SectionIndexer {private List<User> list;private Context context;private LayoutInflaterinflater;public MyAdapter(Context context, List<User> list) {this.context = context;this.list = list;inflater = LayoutInflater.from(context); }@Overridepublic intgetCount() {return list.size();}@Overridepublic Object getItem(int position) { return list.get(position);}@Overridepublic long getItemId(int position) { return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder;if (convertView == null) {convertView = inflater.inflate(yout.listview_item, null);holder = new ViewHolder();holder.showLetter = (TextView) convertView.findViewById(R.id.show_letter); ername = (TextView) convertView.findViewById(ername); convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}User user = list.get(position);ername.setText(user.getUsername());//获得当前position是属于哪个分组intsectionForPosition = getSectionForPosition(position);//获得该分组第一项的positionintpositionForSection = getPositionForSection(sectionForPosition);//查看当前position是不是当前item所在分组的第一个item//如果是,则显示showLetter,否则隐藏if (position == positionForSection) {holder.showLetter.setVisibility(View.VISIBLE);holder.showLetter.setText(user.getFirstLetter());} else {holder.showLetter.setVisibility(View.GONE);}return convertView;}@Overridepublic Object[] getSections() {return new Object[0];}//传入一个分组值[A....Z],获得该分组的第一项的position@Overridepublic intgetPositionForSection(intsectionIndex) {for (inti = 0; i<list.size(); i++) {if (list.get(i).getFirstLetter().charAt(0) == sectionIndex) {return i;}}return -1;}//传入一个position,获得该position所在的分组@Overridepublic intgetSectionForPosition(int position) {return list.get(position).getFirstLetter().charAt(0);}class ViewHolder {TextView username, showLetter;}}这个Adapter大部分还是和我们之前的Adapter一样的,只不过这里实现了SectionIndexer接口,实现了这个接口,我们就要实现该接口中的三个方法,分别是getSections(),getPositionForSection(),getSectionForPosition()这三个方法,我们这里用到的主要是后面这两个方法,那我来详细说一下:1.getPositionForSection(intsectionIndex)这个方法接收一个int类型的参数,该参数实际上就是指我们的分组,我们在这里传入分组的值【A.....Z】,然后我们在方法中通过自己的计算,返回该分组中第一个item的position。

相关文档
最新文档