《APP研發錄》讀書筆記(1、重構)
1、重新規劃Android專案結構
將主專案中的類分門別類的進行劃分,放置在各種包中
詳細介紹如下:
activity:所有的activity放在同一個包中,細分的話,將不同模組的activity劃分到不同的包下。
adapter:將所有的介面卡放在一塊。
entry:將所有的實體放在一塊。
db:資料庫。
engine:業務相關的類放在一塊。
ui:自定義控制元件。
utils:工具類。
interfaces:所有的介面,命名一I作為開頭
listener:基於listener的介面,命名以On開頭。
(1)、每個檔案只有一個單獨的類,不能巢狀類,比如在activity巢狀adapter、entry
(2)、可以迅速定位,分工明確
2、為activity定義新的生命週期
單一職責:一個類或一個方法,只負責一件事
在activity中新增下列方法,分工明確,易讀
initVariables():初始化變數,包括Intent和activity內的變數。
initViews(); 初始化控制元件,新增點選事件,介面卡,等。
initData();獲取資料
3、統一事件模型
3中點選事件方法
1、
`public class MainActivity extends Activity {
private Button btnshow;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnshow = (Button) findViewById(R.id.btnshow); btnshow.setOnClickListener(new OnClickListener() { //重寫點選事件的處理方法onClick() @Override public void onClick(View v) { //顯示Toast資訊 Toast.makeText(getApplicationContext(), "你點選了按鈕", Toast.LENGTH_SHORT).show(); } }); }
} `
2、
//讓Activity方法實現OnClickListener介面
public class MainActivity extends Activity implements OnClickListener{
private Button btnshow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnshow = (Button) findViewById(R.id.btnshow);
//直接寫個this
btnshow.setOnClickListener(this);
}
//重寫介面中的抽象方法
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "點選了按鈕", Toast.LENGTH_SHORT).show();
}
}
3、
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕"
android:onClick="myclick"/>
</LinearLayout>
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//自定義一個方法,傳入一個view元件作為引數
public void myclick(View source)
{
Toast.makeText(getApplicationContext(), "按鈕被點選了", Toast.LENGTH_SHORT).show();
}
}
作者比較推崇第一種
只要在一個團隊內部達成了協議,決定使用某種事件程式設計方式,所有開發人員就要按照同樣的方式編碼。只要不是各有各的編碼風格就好。
4、實體化程式設計
4.1在網路請求中使用實體
用fastjson,gosn代替JSonobject和JsonArray解析json資料
4.2使用實體生成器
4.3在頁面跳轉中使用實體
對資料必須進行序列化
5、adapter模板
<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"
android:padding="10dp">
<TextView
android:id="@+id/titleTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="Android新技能"
android:textColor="#444"
android:textSize="16sp" />
<TextView
android:id="@+id/descTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/titleTv"
android:layout_marginTop="10dp"
android:maxLines="2"
android:minLines="1"
android:text="Android為ListView和GridView打造萬能介面卡"
android:textColor="#898989"
android:textSize="16sp" />
<TextView
android:id="@+id/timeTv"
android:paddingTop="3dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/descTv"
android:layout_marginTop="10dp"
android:text="2015-05-04"
android:textColor="#898989"
android:textSize="12sp" />
<TextView
android:padding="2dp"
android:id="@+id/phoneTv"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/descTv"
android:layout_marginTop="10dp"
android:background="#2ED667"
android:drawableLeft="@mipmap/phone"
android:drawablePadding="5dp"
android:text="10086"
android:textColor="#ffffff"
android:textSize="12sp"
android:layout_alignParentRight="true" />
</RelativeLayout>
public class Bean {
private String title;
private String desc;
private String time;
private String phone;
public Bean() {
}
public Bean(String title, String desc, String time, String phone) {
this.title = title;
this.desc = desc;
this.time = time;
this.phone = phone;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<Bean> mDatas;
//MyAdapter需要一個Context,通過Context獲得Layout.inflater,然後通過inflater載入item的佈局
public MyAdapter(Context context, List<Bean> datas) {
mInflater = LayoutInflater.from(context);
mDatas = datas;
}
//返回資料集的長度
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//這個方法才是重點,我們要為它編寫一個ViewHolder
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_listview, parent, false); //載入佈局
holder = new ViewHolder();
holder.titleTv = (TextView) convertView.findViewById(R.id.titleTv);
holder.descTv = (TextView) convertView.findViewById(R.id.descTv);
holder.timeTv = (TextView) convertView.findViewById(R.id.timeTv);
holder.phoneTv = (TextView) convertView.findViewById(R.id.phoneTv);
convertView.setTag(holder);
} else { //else裡面說明,convertView已經被複用了,說明convertView中已經設定過tag了,即holder
holder = (ViewHolder) convertView.getTag();
}
Bean bean = mDatas.get(position);
holder.titleTv.setText(bean.getTitle());
holder.descTv.setText(bean.getDesc());
holder.timeTv.setText(bean.getTime());
holder.phoneTv.setText(bean.getPhone());
return convertView;
}
//這個ViewHolder只能服務於當前這個特定的adapter,因為ViewHolder裡會指定item的控制元件,不同的ListView,item可能不同,所以ViewHolder寫成一個私有的類
private class ViewHolder {
TextView titleTv;
TextView descTv;
TextView timeTv;
TextView phoneTv;
}
使用
public class MainActivity extends Activity {
private ListView listView;
private List<Bean> mDatas;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
//方法:初始化View
private void initView() {
listView = (ListView) findViewById(R.id.listView);
}
//方法;初始化Data
private void initData() {
mDatas = new ArrayList<Bean>();
//將資料裝到集合中去
Bean bean = new Bean("Android新技能1", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
mDatas.add(bean);
bean = new Bean("Android新技能2", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
mDatas.add(bean);
bean = new Bean("Android新技能3", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
mDatas.add(bean);
bean = new Bean("Android新技能4", "Android為ListView和GridView打造萬能介面卡", "2015-05-04", "10086");
mDatas.add(bean);
//為資料繫結介面卡
mAdapter = new MyAdapter(this,mDatas);
listView.setAdapter(mAdapter);
}
}
6、型別安全裝換函式
型別轉換時,要判斷需要轉換的資料是否為空,提高程式健壯性
不要一門心思的看程式碼,生活能教會我們很多,然後反過來讓我們對程式設計有更深刻的認識。