編輯:關於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就是它。我已經打包到源碼,有興趣的可以看下。
好了就說這麼多大家有什麼疑問隨時@我 點擊源碼下載
先來看一張預覽圖: 廢話不多說,直接上代碼:<RelativeLayout xmlns:android=http://schemas.android.co
之前備份短信的時候生成xml都是手動拼寫的,有一個問題:當短信裡面存在這樣的標簽的時候,最後結果就不是完整的xml文件,顯然出錯。但是,今天使用序列化器的方式,就能有效的
上周花了一周時間做的課程設計的項目,實現的功能如下:基本功能:(1) 該APP能夠通過藍牙自動搜索周圍其他使用了該APP的手機,用戶可選擇其中某一個APP發起對戰的要求,
閒來無聊,最近了解了一下多媒體的一些初步知識。音頻播放主要設計到MediaPlayer這個類,播放音頻的路徑可以來源於三個地方。1.應用內的音頻public class