联系人字母排序

activiity代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**

  • @Description:联系人显示界面

  • @author http://blog.csdn.net/finddreams
    */
    public class MainActivity extends Activity {

    private View mBaseView;
    private ListView sortListView;
    private SideBar sideBar;
    private TextView dialog;
    private SortAdapter adapter;
    private ClearEditText mClearEditText;
    private Map<String, String> callRecords;

    private CharacterParser characterParser;
    private List SourceDateList;

    private PinyinComparator pinyinComparator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_contact);
    initView();
    initData();
    }

    private void initView() {
    sideBar = (SideBar) this.findViewById(R.id.sidrbar);
    dialog = (TextView) this.findViewById(R.id.dialog);

     sortListView = (ListView) this.findViewById(R.id.sortlist);
    

    }

    private void initData() {
    // 实例化汉字转拼音类
    characterParser = CharacterParser.getInstance();

     pinyinComparator = new PinyinComparator();
    
     sideBar.setTextView(dialog);
    
     // 设置右侧触摸监听
     sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {
    
     	@SuppressLint("NewApi")
     	@Override
     	public void onTouchingLetterChanged(String s) {
     		// 该字母首次出现的位置
     		int position = adapter.getPositionForSection(s.charAt(0));
     		if (position != -1) {
     			sortListView.setSelection(position);
     		}
     	}
     });
    
     sortListView.setOnItemClickListener(new OnItemClickListener() {
    
     	@Override
     	public void onItemClick(AdapterView<?> parent, View view,
     			int position, long id) {
     		// 这里要利用adapter.getItem(position)来获取当前position所对应的对象
     		// Toast.makeText(getApplication(),
     		// ((SortModel)adapter.getItem(position)).getName(),
     		// Toast.LENGTH_SHORT).show();
     		String number = callRecords.get(((SortModel) adapter
     				.getItem(position)).getName());
     		Toast.makeText(MainActivity.this, number, Toast.LENGTH_SHORT).show();
     	}
     });
    
     new ConstactAsyncTask().execute(0);
    

    }

    private class ConstactAsyncTask extends AsyncTask<Integer, Integer, Integer> {

     @Override
     protected Integer doInBackground(Integer... arg0) {
     	int result = -1;
     	callRecords = ConstactUtil.getAllCallRecords(MainActivity.this);
     	result = 1;
     	return result;
     }
     @Override
     protected void onPostExecute(Integer result) {
     	super.onPostExecute(result);
     	if (result == 1) {
     		List<String> constact = new ArrayList<String>();
     		for (Iterator<String> keys = callRecords.keySet().iterator(); keys
     				.hasNext();) {
     			String key = keys.next();
     			constact.add(key);
     		}
     		String[] names = new String[] {};
     		names = constact.toArray(names);
     		SourceDateList = filledData(names);
    
     		// 根据a-z进行排序源数据
     		Collections.sort(SourceDateList, pinyinComparator);
     		adapter = new SortAdapter(MainActivity.this, SourceDateList);
     		sortListView.setAdapter(adapter);
    
     		mClearEditText = (ClearEditText) MainActivity.this
     				.findViewById(R.id.filter_edit);
     		mClearEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
     			
     			@Override
     			public void onFocusChange(View arg0, boolean arg1) {
     				mClearEditText.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
     				
     			}
     		});
     		// 根据输入框输入值的改变来过滤搜索
     		mClearEditText.addTextChangedListener(new TextWatcher() {
    
     			@Override
     			public void onTextChanged(CharSequence s, int start,
     					int before, int count) {
     				// 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
     				filterData(s.toString());
     			}
    
     			@Override
     			public void beforeTextChanged(CharSequence s, int start,
     					int count, int after) {
    
     			}
    
     			@Override
     			public void afterTextChanged(Editable s) {
     			}
     		});
     	}
     }
    
     @Override
     protected void onPreExecute() {
     	super.onPreExecute();
     }
    

    }

    /**

    • 为ListView填充数据

    • @param date

    • @return
      */
      private List filledData(String[] date) {
      List mSortList = new ArrayList();

      for (int i = 0; i < date.length; i++) {
      SortModel sortModel = new SortModel();
      sortModel.setName(date[i]);
      // 汉字转换成拼音
      String pinyin = characterParser.getSelling(date[i]);
      String sortString = pinyin.substring(0, 1).toUpperCase();

       // 正则表达式,判断首字母是否是英文字母
       if (sortString.matches("[A-Z]")) {
       	sortModel.setSortLetters(sortString.toUpperCase());
       } else {
       	sortModel.setSortLetters("#");
       }
      
       mSortList.add(sortModel);
      

      }
      return mSortList;

    }

    /**

    • 根据输入框中的值来过滤数据并更新ListView

    • @param filterStr
      */
      private void filterData(String filterStr) {
      List filterDateList = new ArrayList();

      if (TextUtils.isEmpty(filterStr)) {
      filterDateList = SourceDateList;
      } else {
      filterDateList.clear();
      for (SortModel sortModel : SourceDateList) {
      String name = sortModel.getName();
      if (name.indexOf(filterStr.toString()) != -1
      || characterParser.getSelling(name).startsWith(
      filterStr.toString())) {
      filterDateList.add(sortModel);
      }
      }
      }

      // 根据a-z进行排序
      Collections.sort(filterDateList, pinyinComparator);
      adapter.updateListView(filterDateList);
      }

}
适配器:

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;
/**

  • @Description:用来处理集合中数据的显示与排序

  • @author http://blog.csdn.net/finddreams
    */
    public class SortAdapter extends BaseAdapter implements SectionIndexer{
    private List list = null;
    private Context mContext;

    public SortAdapter(Context mContext, List list) {
    this.mContext = mContext;
    this.list = list;
    }

    /**

    • 当ListView数据发生变化时,调用此方法来更新ListView
    • @param list
      */
      public void updateListView(List list){
      this.list = list;
      notifyDataSetChanged();
      }

    public int getCount() {
    return this.list.size();
    }

    public Object getItem(int position) {
    return list.get(position);
    }

    public long getItemId(int position) {
    return position;
    }

    public View getView(final int position, View view, ViewGroup arg2) {
    ViewHolder viewHolder = null;
    final SortModel mContent = list.get(position);
    if (view == null) {
    viewHolder = new ViewHolder();
    view = LayoutInflater.from(mContext).inflate(R.layout.phone_constacts_item, null);
    viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
    viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
    viewHolder.icon = (ImageTextView) view.findViewById(R.id.icon);
    view.setTag(viewHolder);
    } else {
    viewHolder = (ViewHolder) view.getTag();
    }

     //根据position获取分类的首字母的Char ascii值
     int section = getSectionForPosition(position);
     
     //如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
     if(position == getPositionForSection(section)){
     	viewHolder.tvLetter.setVisibility(View.VISIBLE);
     	viewHolder.tvLetter.setText(mContent.getSortLetters());
     }else{
     	viewHolder.tvLetter.setVisibility(View.GONE);
     }
    
     viewHolder.tvTitle.setText(this.list.get(position).getName());
     viewHolder.icon.setText(this.list.get(position).getName());
     viewHolder.icon.setIconText(mContext,this.list.get(position).getName());
     return view;
    

    }

    final static class ViewHolder {
    TextView tvLetter;
    TextView tvTitle;
    ImageTextView icon;

    }

    /**

    • 根据ListView的当前位置获取分类的首字母的Char ascii值
      */
      public int getSectionForPosition(int position) {
      return list.get(position).getSortLetters().charAt(0);
      }

    /**

    • 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
      */
      public int getPositionForSection(int section) {
      for (int i = 0; i < getCount(); i++) {
      String sortStr = list.get(i).getSortLetters();
      char firstChar = sortStr.toUpperCase().charAt(0);
      if (firstChar == section) {
      return i;
      }
      }

      return -1;
      }

    /**

    • 提取英文的首字母,非英文字母用#代替。
    • @param str
    • @return
      */
      private String getAlpha(String str) {
      String sortStr = str.trim().substring(0, 1).toUpperCase();
      // 正则表达式,判断首字母是否是英文字母
      if (sortStr.matches("[A-Z]")) {
      return sortStr;
      } else {
      return “#”;
      }
      }

    @Override
    public Object[] getSections() {
    return null;
    }
    }
    activity布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.example.wengd.contract.ClearEditText
        android:id="@+id/filter_edit"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dip"
        android:gravity="center"
        android:background="@drawable/acm_inputbox"
        android:drawableLeft="@drawable/search"
        android:hint="@string/search"
        android:singleLine="true"
        android:textSize="15.0dip" />

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <ListView
            android:id="@+id/sortlist"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
               android:background="@color/whites"
              android:listSelector="@drawable/comm_btn_selector"
            android:layout_gravity="center" />

        <TextView
            android:id="@+id/dialog"
            android:layout_width="80.0dip"
            android:layout_height="80.0dip"
            android:layout_gravity="center"
            android:background="@drawable/number_base"
            android:gravity="center"
            android:textColor="#ffffffff"
            android:textSize="30.0dip"
            android:visibility="invisible" />

        <com.example.wengd.contract.SideBar
            android:id="@+id/sidrbar"
            android:layout_width="30.0dip"
            android:layout_height="fill_parent"
            android:layout_gravity="right|center" />
    </FrameLayout>
</LinearLayout>
item布局: <?xml version="1.0" encoding="utf-8"?>
<TextView
    android:id="@+id/catalog"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="#454545"
    android:paddingLeft="5dip"
    android:paddingTop="5dip"
    android:clickable="false"
   	android:enabled="false"
    android:background="@color/bg_sort_color"
    android:paddingBottom="5dip"/>
<LinearLayout 
    android:id="@+id/ll_constact"
    android:layout_height="60dp"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:gravity="center_vertical"
   >
    <com.example.wengd.contract.ImageTextView
        android:id="@+id/icon"
        android:layout_marginLeft="5dip"
        android:layout_height="wrap_content"
        android:layout_width="45dip"
        android:text="find"
       />
    <TextView 
        android:id="@+id/title"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:textColor="#336598"
        android:layout_marginLeft="10dp"
        android:textSize="18sp"/>
</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值