1.基礎知識
- 這個MVVM框架我憑感覺亂寫的
- 導包一直出錯,報support-v4什麼的,問題很大,後來改用 AndroidStdio新建項目
- 之後在app外gradle中添加
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
就好了
2. 數據庫設計
1.創建數據庫幫助類並初始化
1)kotlin的寫法,前面那個是初始化主構造器的參數,後面繼承寫的參數是主構造器調用的父類傳入參數(相當於java的super)
class StudentbaseHelpter(context: Context?) :
SQLiteOpenHelper(context,Constants.DATABASE_NAME,null, Constants.VERSIONCODE) {
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL("create table studentinfo(_id integer,name varchar,sno varchar,class varchar,grade int)")
}
2)建立Model包,新建Contracts類,並創建伴生對象,包含數據庫所用信息,供Helpter類使用
3)來到主AC,新建學生幫助類對象,並且完成學生數據庫的初始化創建
2.完善學生類增刪改查
- 改寫插入數據
1)改寫
2)測試調用可以,主要這邊主構造器獲取的context,var出來供Helpter對象聲明
fun insert(sid :Int,sname:String,sno:String,sclass:String,sgrade:Int) {
mhelper = StudentbaseHelpter(appContext)
//寫入
val db = mhelper?.getWritableDatabase()//獲取到數據庫後對錶進行查找
/* val sql =
"insert into studentinfo(_id,name,sno,class,grade) values(?,?,?,?,?)"
db?.execSQL(sql, arrayOf(1, "Kirika", "18", "1",80))*/
val values = ContentValues()//接着添加數據
values.put("_id", sid)
values.put("name",sname)
values.put("sno", sno)
values.put("class", sclass)
values.put("grade", sgrade)
db?.insert(Constants.TABLE_SNAME, null, values)//二參數是可否爲空字段 三參數是填充內容 hashMap結構
db?.close()//關閉相關引用
}
2. 修改刪除,sql和以前一樣,多個?應該可以多條件
fun deletebyid(sid: Int) {
mhelper = StudentbaseHelpter(appContext)
val db = mhelper?.getWritableDatabase()//獲取到數據庫後對錶進行查找
/*var sql:String="delete from "+Constants.TABLE_SNAME+ " where _id="+sid
db?.execSQL(sql);*/
db?.delete(Constants.TABLE_SNAME, "_id=?", arrayOf(sid.toString()));
db?.close()//關閉相關引用
}
3.新建管理員數據庫,用於登錄
- 在Hlepter類的主構造器建立數據庫,oncreate()中初始化即可
2. 準備登錄註冊的方法,寫跳轉的時候發現anko庫添加會報錯v4.。。神奇目前解決不了
整理結構
1.導包
調整好導包失敗的原因後,導入anko,bottombar,cardview包
2.建立Base包,添加BaseActivity和BaseFragment
- 內容見Frawayplayer,將原放在oncreate中的內容做抽取,層次更明確,且規範子類的運
3.登錄界面完成數據庫的初始化後進入MAC界面
- 返回一個界面佈局
- 兩個數據庫的初始化(initDate)
- initlistener的登錄跳轉
4.添加BottomBar
- 複製GithubBottomBar樣例,LinearLayout下一個Fragment,一個BottomBar(要指定組件來源)
- 寫個xml文件,整個<tab組件加入BottomBar
- 運行就有底部欄了
4.5設置BottomBar監聽
- 準備一個FragmentUtil類來切換對應點擊
- 思路是準備多個Fragment進行點擊和返回對應的切換
- 設置點擊監聽,返回對應的Fragement佈局進行替換
override fun initListener() {
bottomBar.setOnTabSelectListener{
// it代表參數id
val transaction = supportFragmentManager.beginTransaction()
//將當前container替換爲第二個參數由FragmentUtil獲取
transaction.replace(R.id.container, FragmentUtil.fragmentUtil.getFragment(it),it.toString())//it後需要一個tag
transaction.commit()
}
}
5.設置ToolBar
- 先設置主題爲noActionBar
- 添加自定義toolba.xml文件
1)設置前景,背景色
2)在MAC界面Fragment上include引入該佈局 - 添加一個接口工具類來設置ToolBar上顯示的東西,MAC實現接口,並且惰性加載一個對象,在initData中實現該初始化賦值方法
6.Home主頁與RecycleView
- Home頁面對應的Fragment中加入一個下拉刷新和RecycleView
- 來到HomeFragment中首先初始化layout,獲取當前context
- 建立對應HomeAdapter類,獲取適配的adapter結構,將其值給RecycleView即可
1)建立adapter
a. 創建homeholder獲取對應View
b. 複寫三個方法,綁定數據的方法爲子項賦值的方法,可以不寫,返回數據的先來個20條,nCreateViewHolder用於返回每條的數據,這裏採用一個Widget方式建立HomeItemView,返回HomeHolder(HomeItemView(parent?.context))
2)建立HomeItemVIew,指定複寫的構造方法和佈局即可
//複寫三個次級構造方法
//代碼new相關
constructor(context: Context?) : super(context)
//清單文件相關
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
//主題相關
constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle)
/*初始化方法 調用主,次構造方法都會執行
下面階段的inflate方法傳入一個xml文件進行調用
* */
init {
//this 當前的xml文件解析爲view傳過去 填null則應寫addview
View.inflate(context,R.layout.item_home,this)
}
//這個是完成後的HF適配
override fun initListener() {
//2.1初始化layout的 recycler_view1
recycler_view1.layoutManager = LinearLayoutManager(context)
//適配 調用HomeAdapter
val adapter=HomeAdapter()
recycler_view1.adapter = adapter
// 谷歌自帶的刷新效果默認有點醜 初始化刷新控件
refreshLayout.setColorSchemeColors(Color.RED, Color.YELLOW, Color.GREEN)
//2.2設置刷新監聽
// 可選1.內部只有一個方法 直接打開 2.和之前一樣傳一個匿名內部類
}
- 具體HomeFragment進行主頁數據的裝載
1)複寫initdate()方法,寫個獲取數據的方法loadDates()調用獲取數據【數據庫查詢靜態操作放在這裏
2)複寫initlistener方法,用於初始recycleview,因爲這個是動態的
a.指定佈局中的RelativeLayout爲LingerLayout
b. 創建一個adapter給他即可,一切監聽有adapter實現,來到adapter
b1)getItemCount返回20條記錄
b2)onCreateViewHolder,返回創建的條目信息即可 - 信息的裝載【調用方法,拿到list】,adapter中對應寫一個方法,updatelist中轉,給每個條目設置即可
1)代碼1,adapter更新方法
private var list=ArrayList<StudentBean>()//用裏面的list匿名內部類
//在集合中先清空 再添加
fun updateList(list: List<StudentBean>){//傳入一個對應集合 到時候側試一下傳原lei還是內部類
this.list.clear()
this.list.addAll(list)//牛逼
notifyDataSetChanged()//刷新一下
}
2)代碼2,onBindView根據自動position和list綁定更新,更新來到調用條目view
override fun onBindViewHolder(holder: HomeHolder, position: Int) {
//能顯示幾條後再進行數據綁定
//如果是最後一條就不刷新view
if(position==list.size)
return
//1.拿到條目數據
val data=list.get(position)
//2.拿到條目View
val itemView=holder.itemView as HomeItemView
//3.條目刷新
itemView.setDate(data)
}
3)代碼3,條目view更新
/*刷新條目view數據*/
fun setDate(data: StudentBean) {
sid.setText(data.get_id().toString())
name.setText(data.getname())
sno.setText(data.getsno())
stclass.setText(data.getstclass())
grade.setText(data.getgrade().toString())
}
7.其他增刪改查,佈局和界面都不贅述了,下面是圖片展示【成功後加個toast記錄】
-
查詢信息首頁
-
添加學生
-
根據id刪除學生信
-
修改學生信息
-
兩個數據庫