這次做的是一個簡單的通訊錄,有兩個頁面,第一個頁面呈現聯系人,第二個頁面是顯示聯系人的詳細信息。
先上兩張效果圖:
  

可以進行的操作大家可以下載來試一下,功能不是很多,但是對于入門Android的童鞋來說還是比較有意思的。
下面講一下技術要點:
對于ListView來說,他的布局是很簡單的:
<ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"/> 要注意的是這個id是一定要是設的,因為后面需要在.java文件中填充數據。在.java文件中獲得這個ListView之后,使用Adapter為這個ListView填充數據,常用的Adapter有ArrayAdapter,SimpleAdapter,隨著ListView中內容的豐富,以上兩種Adapter已經很難滿足需要,因此現在一般使用自定義的Adapter來填充數據。
在這個應用中,我是用了自定義的Adapter以及SimpleAdapter。
對于SimpleAdapter,,創建SimpleAdapter需要5個參數,第一個參數依然是Context,就不多說了,下面介紹余下的4個參數:第2個參數:該參數應該是一個List<? Extends Map<String, ?>>類型的集合對象,該集合中每個Map<String, ?>對象生成一個列表項。第3個參數:該參數指定一個界面布局的ID。該界面布局指定每一個列表項的樣式。第4個參數:該參數應該是一個String[]類型的參數,該參數決定提取Map<String, ?>對象中哪些key對應的value來生成列表項。第5個參數:該參數應該是一個int[]類型的參數,該參數決定填充哪些組件。
public void More_PRocess() { String[] op = {"編輯聯系人", "分享聯系人", "加入黑名單", "刪除聯系人"}; // 使用SimpleAdapter填充數據 List<Map<String, Object>> mapList = new ArrayList<>(); for (int i = 0; i < op.length; i++) { Map<String, Object> temp = new LinkedHashMap<>(); temp.put("op", op[i]); mapList.add(temp); } SimpleAdapter simpleAdapter = new SimpleAdapter(this, mapList, R.layout.more, new String[]{"op"}, new int[]{R.id.more_to_do}); item_list.setAdapter(simpleAdapter); }這一個Adapter我用來填充聯系人詳情頁面中的下面的一些東西。
對于listView的長按和點擊事件的處理這里就不多說了,這里實現的功能是點擊之后跳轉到聯系人詳情頁面,長按會彈出對話框提示是否刪除這個聯系人。
需要注意的是長按的事件處理是有返回值的,默認是false,但是這樣的話是不能區分長按和點擊的,在我測試的過程中體現出來就是長按之后會彈出對話框,但是也實現了單擊的跳轉功能,改成true之后就正常了。
下面主要介紹一下自定義的Adapter,直接上代碼:
public class MyAdapter extends BaseAdapter { private Context context; private List<Information> list; public MyAdapter(Context context, List<Information> list) { this.context = context; this.list = list; } @Override // 獲取數據項列表的長度,也就是一共有多少個數據項 public int getCount() { if (list == null) return 0; else return list.size(); } @Override // 獲得某一個數據項 public Object getItem(int i) { if (list == null) return null; else return list.get(i); } @Override // 獲得數據項的布局樣式, public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { // 新聲明一個View變量和ViewHolder變量 View convertView; ViewHolder viewHolder; // 當View為空時才加載布局,并且創建一個ViewHolder,獲得布局中的兩個控件 if (view == null) { // 通過inflate方法加載布局,context這個參數需要使用這個adapter的Activity傳入 convertView = LayoutInflater.from(context).inflate(R.layout.item, null); viewHolder = new ViewHolder(); viewHolder.first_name = (TextView) convertView.findViewById(R.id.first_name); viewHolder.name = (TextView) convertView.findViewById(R.id.name); // setTag方法是將處理好的viewHolder放入view中 convertView.setTag(viewHolder); } else { // 否則,讓convertView等于view, 然后從中取出ViewHolder即可 convertView = view; viewHolder = (ViewHolder) convertView.getTag(); } // 從ViewHolder中取出對象,然后負責給他們 viewHolder.first_name.setText(list.get(i).getFirst_name()); viewHolder.name.setText(list.get(i).getName()); return convertView; } private class ViewHolder { public TextView first_name; public TextView name; }}自定義的Adapter需要提供一個數據列表才能填充數據,一般是一個List類型,在這里我是創建了一個information類,然后將List<Information>傳入Adapter中作為數據的列表。
注意這個Information類,因為點擊聯系人頁面之后,跳轉的聯系人詳情頁面中不出bug的話是要顯示詳情的,這些詳情哪里來呢,當然是從main_activity中傳過去啦!所以為了在兩個activity之間傳遞信息,使用bundle來實現。這個Information類就需要實現serializable.
傳遞和接收是這樣的:
Intent intent = new Intent(MainActivity.this, Particulars.class); Bundle bundle = new Bundle(); bundle.putSerializable("information", list.get(i)); intent.putExtras(bundle); startActivity(intent);Information information = (Information) this.getIntent().getSerializableExtra("information");有興趣的童鞋可以下載源碼來玩一下:點擊下載源碼
新聞熱點
疑難解答