안 드 로 이 드 핸드폰 연락처 알파벳 색인 빠 른 검색
효과 도 는 다음 과 같다.
첫 번 째 단계:MainActivity 의 코드 는 다음 과 같 습 니 다.
package net.loonggg.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.TreeSet;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
private HashMap<String, Integer> selector;//
private LinearLayout layoutIndex;
private ListView listView;
private TextView tv_show;
private ListViewAdapter adapter;
private String[] indexStr = { "#", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z" };
private List<Person> persons = null;
private List<Person> newPersons = new ArrayList<Person>();
private int height;//
private boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
layoutIndex = (LinearLayout) this.findViewById(R.id.layout);
layoutIndex.setBackgroundColor(Color.parseColor("#00ffffff"));
listView = (ListView) findViewById(R.id.listView);
tv_show = (TextView) findViewById(R.id.tv);
tv_show.setVisibility(View.GONE);
setData();
String[] allNames = sortIndex(persons);
sortList(allNames);
selector = new HashMap<String, Integer>();
for (int j = 0; j < indexStr.length; j++) {// , newPersons
for (int i = 0; i < newPersons.size(); i++) {
if (newPersons.get(i).getName().equals(indexStr[j])) {
selector.put(indexStr[j], i);
}
}
}
adapter = new ListViewAdapter(this, newPersons);
listView.setAdapter(adapter);
}
/**
* List
*
* @param allNames
*/
private void sortList(String[] allNames) {
for (int i = 0; i < allNames.length; i++) {
if (allNames[i].length() != 1) {
for (int j = 0; j < persons.size(); j++) {
if (allNames[i].equals(persons.get(j).getPinYinName())) {
Person p = new Person(persons.get(j).getName(), persons
.get(j).getPinYinName());
newPersons.add(p);
}
}
} else {
newPersons.add(new Person(allNames[i]));
}
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// oncreate , oncreate getHeight=0
if (!flag) {// flag , , ,
height = layoutIndex.getMeasuredHeight() / indexStr.length;
getIndexView();
flag = true;
}
}
/**
*
*
* @param persons
* @return
*/
public String[] sortIndex(List<Person> persons) {
TreeSet<String> set = new TreeSet<String>();
// , set
for (Person person : persons) {
set.add(StringHelper.getPinYinHeadChar(person.getName()).substring(
0, 1));
}
// set
String[] names = new String[persons.size() + set.size()];
int i = 0;
for (String string : set) {
names[i] = string;
i++;
}
String[] pinYinNames = new String[persons.size()];
for (int j = 0; j < persons.size(); j++) {
persons.get(j).setPinYinName(
StringHelper
.getPingYin(persons.get(j).getName().toString()));
pinYinNames[j] = StringHelper.getPingYin(persons.get(j).getName()
.toString());
}
//
System.arraycopy(pinYinNames, 0, names, set.size(), pinYinNames.length);
//
Arrays.sort(names, String.CASE_INSENSITIVE_ORDER);
return names;
}
/**
*
*/
public void getIndexView() {
LinearLayout.LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT, height);
for (int i = 0; i < indexStr.length; i++) {
final TextView tv = new TextView(this);
tv.setLayoutParams(params);
tv.setText(indexStr[i]);
tv.setPadding(10, 0, 10, 0);
layoutIndex.addView(tv);
layoutIndex.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event)
{
float y = event.getY();
int index = (int) (y / height);
if (index > -1 && index < indexStr.length) {//
String key = indexStr[index];
if (selector.containsKey(key)) {
int pos = selector.get(key);
if (listView.getHeaderViewsCount() > 0) {// ListView , 。
listView.setSelectionFromTop(
pos + listView.getHeaderViewsCount(), 0);
} else {
listView.setSelectionFromTop(pos, 0);//
}
tv_show.setVisibility(View.VISIBLE);
tv_show.setText(indexStr[index]);
}
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
layoutIndex.setBackgroundColor(Color
.parseColor("#606060"));
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
layoutIndex.setBackgroundColor(Color
.parseColor("#00ffffff"));
tv_show.setVisibility(View.GONE);
break;
}
return true;
}
});
}
}
/**
*
*/
private void setData() {
persons = new ArrayList<Person>();
Person p1 = new Person(" ");
persons.add(p1);
Person p2 = new Person(" ");
persons.add(p2);
Person p3 = new Person(" ");
persons.add(p3);
Person p4 = new Person(" ");
persons.add(p4);
Person p5 = new Person(" P");
persons.add(p5);
Person p6 = new Person(" ");
persons.add(p6);
Person p7 = new Person(" ");
persons.add(p7);
Person p8 = new Person(" ");
persons.add(p8);
Person p9 = new Person(" ");
persons.add(p9);
Person p10 = new Person(" ");
persons.add(p10);
Person p11 = new Person(" ");
persons.add(p11);
Person p12 = new Person(" ");
persons.add(p12);
Person p13 = new Person(" ");
persons.add(p13);
Person p14 = new Person(" ");
persons.add(p14);
Person p15 = new Person(" ");
persons.add(p15);
Person p16 = new Person(" ");
persons.add(p16);
Person p17 = new Person(" ");
persons.add(p17);
Person p18 = new Person(" ");
persons.add(p18);
Person p19 = new Person(" ");
persons.add(p19);
Person p20 = new Person(" ");
persons.add(p20);
Person p21 = new Person(" ");
persons.add(p21);
}
}
이 Activity 의 레이아웃 파일 은 다음 과 같 습 니 다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text=" "
android:textColor="#000000"
android:textSize="16sp" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
android:fadingEdge="none"
android:scrollbars="none" >
</ListView>
<TextView
android:id="@+id/tv"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:background="#f0606060"
android:gravity="center"
android:text="A"
android:textColor="#ffffff"
android:textSize="30sp" />
<LinearLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="right"
android:background="#d7d7d7"
android:gravity="center"
android:orientation="vertical" >
</LinearLayout>
</FrameLayout>
</LinearLayout>
두 번 째 단계:Adapter 를 사용자 정의 하 였 습 니 다.코드 는 다음 과 같 습 니 다.
package net.loonggg.test;
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.TextView;
public class ListViewAdapter extends BaseAdapter {
private Context context;
private List<Person> list;
private ViewHolder viewHolder;
public ListViewAdapter(Context context, List<Person> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
if (list.get(position).getName().length() == 1)//
return false;//
return super.isEnabled(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String item = list.get(position).getName();
viewHolder = new ViewHolder();
if (item.length() == 1) {
convertView = LayoutInflater.from(context).inflate(R.layout.index,
null);
viewHolder.indexTv = (TextView) convertView
.findViewById(R.id.indexTv);
} else {
convertView = LayoutInflater.from(context).inflate(R.layout.item,
null);
viewHolder.itemTv = (TextView) convertView
.findViewById(R.id.itemTv);
}
if (item.length() == 1) {
viewHolder.indexTv.setText(list.get(position).getName());
} else {
viewHolder.itemTv.setText(list.get(position).getName());
}
return convertView;
}
private class ViewHolder {
private TextView indexTv;
private TextView itemTv;
}
}
세 번 째 단계:사용 하 는 ListView 의 하위 레이아웃 파일 은 다음 과 같 습 니 다.1.index.xml 레이아웃 파일 코드 는 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#9c9c9c"
android:orientation="vertical"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/indexTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0f0f0f" />
</LinearLayout>
2.item.xml 레이아웃 파일 코드 는 다음 과 같 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="vertical"
android:paddingBottom="5dp"
android:paddingLeft="20dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/itemTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>
네 번 째 단계:사용 하 는 실체 류 와 도구 류 는 다음 과 같다.1.Person.java 코드 는 다음 과 같 습 니 다.
package net.loonggg.test;
public class Person {
private String name;
private String pinYinName;
public Person(String name) {
super();
this.name = name;
}
public Person(String name, String pinYinName) {
super();
this.name = name;
this.pinYinName = pinYinName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPinYinName() {
return pinYinName;
}
public void setPinYinName(String pinYinName) {
this.pinYinName = pinYinName;
}
}
2.도구 류 코드 는 다음 과 같 습 니 다.
package net.loonggg.test;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
public class StringHelper {
/**
*
*
* @param src
* @return
*/
public static String getPingYin(String src) {
char[] t1 = null;
t1 = src.toCharArray();
String[] t2 = new String[t1.length];
HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
t3.setVCharType(HanyuPinyinVCharType.WITH_V);
String t4 = "";
int t0 = t1.length;
try {
for (int i = 0; i < t0; i++) {
//
if (java.lang.Character.toString(t1[i]).matches(
"[\\u4E00-\\u9FA5]+")) {
t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);
t4 += t2[0];
} else {
t4 += java.lang.Character.toString(t1[i]);
}
}
return t4;
} catch (BadHanyuPinyinOutputFormatCombination e1) {
e1.printStackTrace();
}
return t4;
}
/**
*
*
* @param str
* @return
*/
public static String getHeadChar(String str) {
String convert = "";
char word = str.charAt(0);
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
convert += pinyinArray[0].charAt(0);
} else {
convert += word;
}
return convert.toUpperCase();
}
/**
*
*
* @param str
* @return
*/
public static String getPinYinHeadChar(String str) {
String convert = "";
for (int j = 0; j < str.length(); j++) {
char word = str.charAt(j);
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
convert += pinyinArray[0].charAt(0);
} else {
convert += word;
}
}
return convert.toUpperCase();
}
}
여기까지 면 끝 이 야,아주 간단 하지!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.