編輯:關於Android編程
在剛學習Android的時候就想自己手寫一個索引,但是當時還是彩筆,就一直沒做,昨天寫了一個索引,今天貼出來,以備後用,先上圖:

由於列表是我自己封裝的,可能必看到展示頁面的時候會有陌生感,但是並不復雜,很好理解,好了不廢話了,操起鍵盤就是干。
自定義索引欄:
注釋加的已經很清楚了,還是不理解的@我
package app.project.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import app.project.R;
/**
* @author qly
*/
public class MySlideBar extends View {
// 是否點擊
private boolean showBkg = false;
// 監聽面板是否點擊接口
OnTouchingLetterChangedListener onTouchingLetterChangedListener;
// 26個字母
public static String[] b = { "#", "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" };
// 選擇的值
int choose = -1;
private Context context;
// 畫筆
Paint paint = new Paint();
public MySlideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
public MySlideBar(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public MySlideBar(Context context) {
super(context);
this.context = context;
}
/**
* 重寫這個方法
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//背景色繪制為灰色
if (showBkg) {
canvas.drawColor(Color.parseColor("#40000000"));
}
int height = getHeight();
int width = getWidth();
int singleHeight = height / b.length;
for (int i = 0; i < b.length; i++) {
paint.setAntiAlias(true);
paint.setTextSize(context.getResources().getDimensionPixelSize(
R.dimen.sidebar_textsize));
// 點擊的字體和26個字母中的任意一個相等就
if (i == choose) {
paint.setColor(Color.parseColor("#3399ff"));
paint.setFakeBoldText(true);
}
// 字體的X坐標
float xPos = width / 2 - paint.measureText(b[i]) / 2;
// 字體的Y坐標
float yPos = singleHeight * i + singleHeight;
canvas.drawText(b[i], xPos, yPos, paint);
// 還原畫布
paint.reset();
}
}
/**
* 點擊事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
// 點擊的Y坐標
final float y = event.getY();
final int oldChoose = choose;
// 得到當前的值(當前點擊坐標/控件高度*27)
final int c = (int) (y / getHeight() * b.length);
// 根據點擊的狀態不同做出不同的處理
switch (event.getAction()) {
// 按下已經開始
case MotionEvent.ACTION_DOWN:
// 將開關設置為true
showBkg = true;
if (oldChoose != c && onTouchingLetterChangedListener != null) {
if (c >= 0 && c < b.length) {
// 當當前點擊的值綁定監聽
// 這個監聽在本頁面中做的是接口。實際調用是在MainActiv中。也就是說我們調用這個接口會執行MainActivtiy的方法
onTouchingLetterChangedListener.onTouchingLetterChanged(b[c]);
choose = c;
// 刷新界面
invalidate();
}
}
break;
// 松開為完成點擊
case MotionEvent.ACTION_MOVE:
if (oldChoose != c && onTouchingLetterChangedListener != null) {
if (c >= 0 && c < b.length) {
onTouchingLetterChangedListener.onTouchingLetterChanged(b[c]);
choose = c;
invalidate();
}
}
break;
// 完成松開 還原數據 並刷新界面
case MotionEvent.ACTION_UP:
showBkg = false;
choose = -1;
invalidate();
break;
}
return true;
}
/**
* 向外公開的方法
*/
public void setOnTouchingLetterChangedListener(
OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
}
/**
* 接口
*/
public interface OnTouchingLetterChangedListener {
void onTouchingLetterChanged(String s);
}
}
列表展示頁面
package app.project; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.LayoutRes; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import app.project.recycler.DevBaseRecyclerViewActivity; import app.project.recycler.ListBaseRecyclerAdapter; import app.project.utils.BaseStickyBean; import app.project.model.ContactHeader; import app.project.model.ItemsEntity; import app.project.view.MySlideBar; public class IndexActivity extends DevBaseRecyclerViewActivity{ List list=new ArrayList<>(); @Override public void setContentView(@LayoutRes int layoutResID) { super.setContentView(R.layout.activity_index); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MySlideBar mySideBar= (MySlideBar) findViewById(R.id.my_side_bar); mySideBar.setOnTouchingLetterChangedListener(new MySlideBar.OnTouchingLetterChangedListener() { @Override public void onTouchingLetterChanged(String s) { for (int i = 1; i < mList.size(); i++) { if (mList.get(i).getStickItem().equalsIgnoreCase(s)) { mRecyclerView.scrollToPosition(i); } } } }); } @Override public void loadData() { enableSwipeRefresh(false); list.add(new ItemsEntity("阿文")); list.add(new ItemsEntity("Andy")); list.add(new ItemsEntity("梁朝偉")); list.add(new ItemsEntity("周傑倫")); list.add(new ItemsEntity("蔡依林")); list.add(new ItemsEntity("陳慧琳")); list.add(new ItemsEntity("房祖名")); list.add(new ItemsEntity("羅啟新")); list.add(new ItemsEntity("陳浩民")); list.add(new ItemsEntity("蘇友朋")); list.add(new ItemsEntity("胡彥斌")); list.add(new ItemsEntity("葉德娴")); list.add(new ItemsEntity("孫燕姿")); list.add(new ItemsEntity("歐陽震華")); list.add(new ItemsEntity("郭富城")); list.add(new ItemsEntity("麥兆輝")); list.add(new ItemsEntity("向海岚 ")); sortList(list); } public void sortList(List list) { Map > map = new HashMap<>(); for (int i = 0; i < list.size(); i++) { ItemsEntity myContact = list.get(i); List temp = map.get(myContact.getStickItem()); if (temp == null) { temp = new ArrayList<>(); map.put(myContact.getStickItem(), temp); } temp.add(myContact); } List finalList = new ArrayList<>(); List keys = new ArrayList<>(map.keySet()); Collections.sort(keys); for (int i = 0; i < keys.size(); i++) { finalList.add(new ContactHeader(keys.get(i))); finalList.addAll(map.get(keys.get(i))); } mList.addAll(finalList); setListAdapter(); } @Override public void onItemClick(ListBaseRecyclerAdapter.YFViewHolder holder, BaseStickyBean o, int position, long id) { } @Override public View getView(ViewGroup parent, int viewType) { View view=LayoutInflater.from(this).inflate(R.layout.item,parent,false); if(viewType==0){ return view; }else if(viewType==1){ view.setBackgroundColor(Color.parseColor("#CDD7E2")); return view; } return null; } @Override public void convertObject2View(ListBaseRecyclerAdapter.YFViewHolder holder, int position) { if(holder.getItemViewType()==1){ holder.setText(R.id.tv, mList.get(position).getStickItem()); }else if(holder.getItemViewType()==0){ ItemsEntity item= (ItemsEntity) mList.get(position); holder.setText(R.id.tv,item.getName() ); } } @Override public int getItemViewType(int position) { BaseStickyBean bean = mList.get(position); if (bean instanceof ContactHeader) { return 1; } return 0; } }
數據排序的實現
新建一個map用來存儲索引開頭字母和姓名類似:map<字母 姓名> 我們遍歷數據集合並且取出姓名首字母,然後新建集合放入字母對應的名字map 按字母排序Collections.sort(keys);,讓後按照字母遍歷分組排序。這樣就搞定了怎麼獲取的姓名首字母的呢?
我們使用了一個jar包,pinyin4j-2.5.0.jar就是它。我已經打包到源碼,有興趣的可以看下。
好了就說這麼多大家有什麼疑問隨時@我 點擊源碼下載
如何讓安卓(Android)子控件超出父控件的范圍顯示
先來看一張預覽圖: 廢話不多說,直接上代碼:<RelativeLayout xmlns:android=http://schemas.android.co
Android初級教程:使用xml序列器
之前備份短信的時候生成xml都是手動拼寫的,有一個問題:當短信裡面存在這樣的標簽的時候,最後結果就不是完整的xml文件,顯然出錯。但是,今天使用序列化器的方式,就能有效的
Android 藍牙對戰五子棋項目實現(含人機對戰功能)
上周花了一周時間做的課程設計的項目,實現的功能如下:基本功能:(1) 該APP能夠通過藍牙自動搜索周圍其他使用了該APP的手機,用戶可選擇其中某一個APP發起對戰的要求,
Android實現多媒體之播放音樂
閒來無聊,最近了解了一下多媒體的一些初步知識。音頻播放主要設計到MediaPlayer這個類,播放音頻的路徑可以來源於三個地方。1.應用內的音頻public class