第六天
**
目標:
- 理解SharePrefernce
- 滑動刪除功能
- Update實作(上)
**
大家安安,今天我們要先還昨天沒講解完的部分
主要的參考資料來自: https://ithelp.ithome.com.tw/articles/10225749
寫這篇文章的是我的學長,蠻推薦大家看的XD
SharePrefernce是什麼呢? 是一種andrioid儲存資料的方式,適合存小資料,像是如果你有個app裡面要在很多頁面都能顯示不同使用者名稱,有幾種方式
1. 存進資料庫 ex SQLLite
第一種存進資料庫的方式太麻煩了,你只是要存一個小資料,也不是一整個表,這樣用反而有點大材小用
2. 用Bundle在Activity間互傳
第二種,在每一頁都互傳反而有點麻煩,而且資料容易遺失,你只需要傳一個值,沒必要每個地方都用bundle
而且如果你的app是從 A->B->C ,但是只有A.C需要使用者資料,那還要特地傳到B,反而容易資料洩漏
3. 使用SharedPreferce
SharedPreferences的使用非常簡單,能夠輕鬆的存放資料和讀取資料。SharedPreferences只能保存簡單類型的資料,例如,String、int等。
接下來讓我們來看這段程式碼
使用 Context.getSharedPreference(String name, int mode) 方法可以建立多個 SharedPreferences 檔案,每一個檔案透過 name 參數來命名,該檔案的讀寫權限則是利用 mode 參數來做設定,然後寫出get跟set方法,因為沒有值可能會nan所以先給他一個預設值,set的話要呼叫edit()函數才可以使用
也可以清理資料 像是
//由 SharedPreferences 中取出 Editor 物件,透過 Editor 物件將資料存入
SharedPreferences.Editor editor = spref.edit();
//清除 SharedPreferences 檔案中所有資料
editor.clear()
然後記得這部分ket蠻重要的,每個記得都要設key
public class SharedPreUtils {
private static final String PREFERENCES = "uuko";
private static SharedPreferences preferencesSharedPreferences;
private static SharedPreferences getPreferences(Context context) {
if (preferencesSharedPreferences == null) {
preferencesSharedPreferences = context.getSharedPreferences(PREFERENCES, 0);
}
return preferencesSharedPreferences;
}
public static int getInt(Context context, String key, int defaultVal) {
return getPreferences(context).getInt(key, defaultVal);
}
public static void setInt(Context context, String key, int value) {
preferencesSharedPreferences.edit().putInt(key, value).commit();
}
}
2.滑動刪除
根據官方文檔,ItemTouchHelper是一個工具類,可實現側滑刪除和拖拽移動,使用這個工具類需要RecyclerView和Callback。同時根據需要重寫onMove和onSwiped方法。接下來就來講述ItemTouchHelper的使用方法。
2.1 先建一個interface讓adapter可以繼承他的方法
public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition,int toPosition);
void onItemDissmiss(int position);
}
2.2 Adapter實作方法
既然綁到recycleview上那控制recycleview的是adapter,所以我們也要修改adapter
打開homeAdpter,加上
implements ItemTouchHelperAdapter
然後會override兩個function分別是onItemMove->他代表你上下移動的時候要做什麼事情跟onItemDissmiss你滑動的時候做什麼
因為我們是滑動刪除,所以也要把資料刪除,加上todoList.remove(position)可以將list也刪掉你目前要滑動刪除的position,然後notifyItemRemoved(position)這是代表真正的刪除
notifyItemRemoved是會偵測變動的時候也會變動!
@Override
public void onItemMove(int fromPosition, int toPosition) {
Collections.swap(todoList,fromPosition,toPosition);
notifyItemMoved(fromPosition,toPosition);
}
@Override
public void onItemDissmiss(int position) {
todoList.remove(position);
notifyItemRemoved(position);
view.onDelClick(key);
}
2.3然後我們切回HomeActivity在onCreate的ValueEventListener加上
第一行是用callback加上初始化他,第二行要綁到recycleview上
因為我們滑動刪除的是recycleview上的item
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(homeAdapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(activityHomeBinding.recyclerview);
2.4資料庫刪除
記得在外面宣告private HomeContract.View view;
View. onDelClick(key)
就是要讓他傳回activity 因為實作view的是在activity
然後firebase內建的刪除是用youtDataBaseReference.removeValue().addOnCompleteListener
@Override
public void onDelClick(String key) {
mDatabase = FirebaseDatabase.getInstance().getReference().child("Todo").child("Todo" + key);
Log.d("666", "onClick: "+mDatabase);
mDatabase.getRef().removeValue().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
} else {
Toast.makeText(HomeActivity.this, "失敗" +
"", Toast.LENGTH_SHORT).show();
}
}
});
}
4. 實作update
我們要做的是點擊一個item就可以進入更改頁面!
因為是item的地方要點擊,所以我們切回來Homeadpter
綁定資料的是onBindViewHolder的地方,所以我們在裡面做修改!
先在外面初始化這個
private Todo todoItem;
,接下來因為我們要點擊item就進update的畫面
所以要先把主頁這個item的數據傳過去update才可以顯示,傳的時候要設成final,接著用holder.itemView
這個就是你正在點擊的那個item
然後依序把資料傳過去新的activity
用intent.putExtra(“辨認的參數”,值)
就可以了
收的時候就是拿辨認的參數當辨認的依據!
todoItem = todoList.get(position);
final String getTitle = todoList.get(position).getTitle();
final Integer getPiority = todoList.get(position).getPriority();
final String getdate = todoList.get(position).getDate();
final String getdces = todoList.get(position).getDesc();
final String getkey = todoList.get(position).getKey();
final String getclock = todoList.get(position).getClock();
key = todoList.get(position).getKey();
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent aa = new Intent(c, EditActivity.class);
aa.putExtra("piority", getPiority);
aa.putExtra("title", getTitle);
aa.putExtra("date", getdate);
aa.putExtra("decs", getdces);
aa.putExtra("key", getkey);
aa.putExtra("clock", getclock);
c.startActivity(aa);
Log.d("kkk", "onClick: "+key);
}
});
4.2 上次不知道有沒有講到
記得這裡也要初始化你的binding!
private final B mViewDataBinding;
public ViewHolder(B binding) {
super(binding.getRoot());
mViewDataBinding = binding;
}
好了,今天就差不多這樣,有點累了,明天見!