Day06 SharePrefernce+滑動刪除+Update功能(上)


第六天
**
目標:

  1. 理解SharePrefernce
  2. 滑動刪除功能
  3. 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;
}

好了,今天就差不多這樣,有點累了,明天見!

#Android







你可能感興趣的文章

何謂演算法技術面試?讀《Cracking the Coding Interview(提升程式設計師的面試力)》

何謂演算法技術面試?讀《Cracking the Coding Interview(提升程式設計師的面試力)》

Array 傳入值總是被覆蓋

Array 傳入值總是被覆蓋

用 node.js 的 request library 串接 API

用 node.js 的 request library 串接 API






留言討論