快速整合android實現listview的字母A-Z排序,介面側邊字母索引
阿新 • • 發佈:2019-01-02
public abstract class MyExpandAdapter implements ExpandableListAdapter{ //用抽象方法把下拉子選單的不用的方法集中在這裡,方便觀看 //抽象出介面,回撥方法,用方法繼承就可以定義子選單 @Override public void registerDataSetObserver(DataSetObserver observer) { } @Override public void unregisterDataSetObserver(DataSetObserver observer) { } @Override public Object getGroup(int groupPosition) { return null; } @Override public Object getChild(int groupPosition, int childPosition) { return null; } @Override public long getGroupId(int groupPosition) { return 0; } @Override public long getChildId(int groupPosition, int childPosition) { return 0; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEmpty() { return false; } @Override public void onGroupExpanded(int groupPosition) { } @Override public void onGroupCollapsed(int groupPosition) { } @Override public long getCombinedChildId(long groupId, long childId) { return 0; } @Override public long getCombinedGroupId(long groupId) { return 0; } }
3.精簡的下拉子選單自定義SimpleExpAdapter介面卡類
public class SimpleExpAdapter extends MyExpandAdapter{ private List<DataEntity> mDataEntities; //列表資料存放的集合 private Activity mActivity; private LayoutInflater mLayoutInflater; //佈局渲染成一個view public SimpleExpAdapter(List<DataEntity> dataEntities, Activity activity){ mDataEntities = dataEntities; mActivity = activity; mLayoutInflater=mActivity.getLayoutInflater(); } @Override public int getGroupCount() { return mDataEntities.size(); } @Override public int getChildrenCount(int groupPosition) { return mDataEntities.get(groupPosition).getDatas().size(); } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder viewHolder=null; if (convertView==null){ viewHolder=new ViewHolder(); convertView=mLayoutInflater.inflate(R.layout.exlv_item_group,parent,false); viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tv_exlv_group); convertView.setTag(viewHolder); }else { viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.mTextView.setText(String.valueOf(mDataEntities.get(groupPosition).getChar_First()));//介面卡設定列表資料 return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder viewHolder=null; if (convertView==null){ viewHolder=new ViewHolder(); convertView=mLayoutInflater.inflate(R.layout.exlv_item_child,parent,false); viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tv_exlv_child); convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.mTextView.setText(mDataEntities.get(groupPosition).getDatas().get(childPosition)); return convertView; } class ViewHolder{//item放置的控制元件 TextView mTextView; } }
4.資料邏輯控制dao包:
5.封裝列表資料類:public class DataDao { private List<DataEntity> mDataEntities=new ArrayList<>(); public void add(String data){ char data_first=data.toUpperCase().charAt(0); //將首個字母轉換為大寫字母 if (Pinyin.isChinese(data_first)){ //如果首個字母是中文,則獲取漢字首個字母的大寫 data_first= Pinyin.toPinyin(data_first).charAt(0); } //確保取得大寫的唯一首字母,然後繼續執行 for (DataEntity dataEntity:mDataEntities){ if (dataEntity.isSameFirst(data_first)){ dataEntity.addData(data); return; } } DataEntity dataEntity=new DataEntity(); dataEntity.setChar_First(data_first); dataEntity.addData(data); mDataEntities.add(dataEntity); Collections.sort(mDataEntities); } public List<DataEntity> getDataEntities() { System.out.println(mDataEntities.toString()); return mDataEntities; } }
public class DataEntity implements Comparable<DataEntity>{
private char mChar_First; //定義首字母
private List<String> mDatas=new ArrayList<>();
public boolean isSameFirst(char des){//判斷是否與傳入的des相等
return des==this.mChar_First;
}
public void addData(String data){
mDatas.add(data);
Collections.sort(mDatas); //排列首字母相同的列表資料
System.out.println(mDatas.toString());
}
@Override
public int compareTo(DataEntity another) {
return this.mChar_First-another.getChar_First();
}
public List<String> getDatas() { //存放同首字母的列表資料
return mDatas;
}
public char getChar_First() {
return mChar_First;
}
public void setChar_First(char char_First) {
mChar_First = char_First;
}
@Override
public String toString() {
return "DataEntity{" +
"mChar_First=" + mChar_First +
", mDatas=" + mDatas +
'}';
}
}
6顯示的activity介面類(資料直接在addlistdatas()方法中新增):public class MainActivity extends AppCompatActivity {
ExpandableListView mExlv;
DataDao mDataDao=new DataDao();
ListView mLvRight; //右側的字母欄
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
addListdatas();//填充列表假資料測試,失敗經驗:資料不能再setadapter之後進行
initListener();
}
public void initListener(){
mExlv.setAdapter(new SimpleExpAdapter(mDataDao.getDataEntities(), this));
//全都展開不能回縮
for (int i = 0; i < mDataDao.getDataEntities().size(); i++) {
mExlv.expandGroup(i);
}
mExlv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return true;
}
});
mLvRight.setAdapter(new LvRightItemAdapter(this,mDataDao.getDataEntities()));
mLvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mExlv.setSelectedGroup(position);
}
});
}
public void initView(){
mExlv= (ExpandableListView) findViewById(R.id.exlv);
mLvRight= (ListView) findViewById(R.id.lv_right);
}
// public void go1(View view){ //字母檢索
// String str="介面側邊ABc字母檢索";
// for (char c:str.toCharArray()){
// System.out.println("檢索返回:"+Pinyin.toPinyin(c));//如果c為漢字,則返回大寫拼音;如果c不是漢字,則返回String.valueOf(c)
// System.out.println("如果c為漢字,則返回true,否則返回false:"+Pinyin.isChinese(c));
// }
// }
public void addListdatas(){
mDataDao.add("拜拜這是b");
mDataDao.add("啊啊這是a");
mDataDao.add("嘖嘖這是z");
mDataDao.add("煩煩這是f");
mDataDao.add("哥哥這是g");
mDataDao.add("哈哈這是h");
mDataDao.add("看看這是k");
mDataDao.add("啊拜這是ab");
for(int i='a';i<'z';i++){
if (i=='e'||i=='h'){
continue;
}
mDataDao.add((char) i + "1");
mDataDao.add((char) i + "2");
mDataDao.add((char) i + "3");
}
for (int i = 'A'; i <= 'Z'; i++) {
if (i == 'E' || i == 'H') {
continue;
}
mDataDao.add((char) i + "1");
mDataDao.add((char) i + "2");
mDataDao.add((char) i + "3");
}
}
第三步xml介面的構建:
1.activity介面的實現:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity">
<ExpandableListView
android:id="@+id/exlv"
android:groupIndicator="@null"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<ListView
android:id="@+id/lv_right"
android:layout_width="20dp"
android:divider="@null"
android:layout_alignParentRight="true"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
2.exlv_item_child自定義介面卡佈局(可以根據自己想法更改介面顯示)
<TextView android:id="@+id/tv_exlv_child"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#bbb"
android:gravity="center_vertical"
android:paddingLeft="15dp"
android:textSize="12sp">
</TextView>
3.exlv_item_group自定義介面卡佈局(可以根據自己想法更改介面顯示)<TextView android:id="@+id/tv_exlv_group"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="#fff"
android:gravity="center_vertical"
android:paddingLeft="15dp"
android:textSize="12sp">
</TextView>
4.lv_right_item自定義listview介面卡佈局(可以根據自己想法更改介面顯示)<TextView
android:id="@+id/tv_lv_right_item"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="#00ffffff"
android:gravity="center"
android:textSize="12sp">
</TextView>
最後原理總結:-----原理解析概括:字串放入 集合 中進行排序分層結構: A: a開頭名字資料 子選單名字(字串排序:Collections.sort( 資料));所有資料(如電話名字) B:b開頭名字資料 子選單名字(字串排序:Collections.sort( 資料)); C: c開頭資料資料 子選單名字(字串排序:Collections.sort( 資料));.....在ASll碼錶中字母大小寫位置
-----------implement方法構建精簡的下拉子選單介面卡.