iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Mobile Development

深入Android Java程式語言 - 打造我的行動應用系列 第 29

[Day 29] 完成一個記事本app(中) - 刪除功能

  • 分享至 

  • xImage
  •  

接下來要來加上長按刪除功能
如下
GIF
需要變動的就只有三個Activity而已
xml都不需要變動
先從Shpf開始

  • Shpf
public void removeNote(String note) {
    ArrayList<String> notes = getAllNotes();
    if(notes.contains(note)) {
        notes.remove(note);
        saveNotes(notes);
    }
}

首先,在Shpf裡新增一個刪除筆記的方法
先把現在所有的筆記傳給ArrayList
若是裡面有點擊的筆記就將它從Shpf刪然後保存

  • ListAdapter
private Shpf shpf;
public ListAdapter(ArrayList<HashMap<String, String>> arrayList, Shpf shpf) {
    this.arrayList = arrayList;
    this.shpf = shpf;
}

先將Shpf初始化
接著在onBindViewHolder的方法裡在新增一個點擊事件

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        String noteRemove = arrayList.get(position).get("note");
        arrayList.remove(position);
        notifyItemRemoved(position);
        //通知RecyclerView該項目已被移除
        notifyItemRangeChanged(position, arrayList.size());
        //更新剩餘項目
        shpf.removeNote(noteRemove);
        //從SharedPreferences中移除該筆記
        return true;
        //返回true表示事件已處理
    }
});

在這裡,對著要刪除的RecyclerView子項目長按後
它會根據你點擊的那個項目去刪除該筆記
接著再進到MainActivity

  • MainActivity
    MainActivity需要修改的地方只有一處
listAdapter = new ListAdapter(arrayList,shpf);

原本傳入給listAdapter變數的就只有arrayList而已
現在在這邊再多加一個shpf就可以了
只需要修改這些地方就可以在這個筆記中使用刪除單個項目的功能了

下面附上修改後的程式

ListAdapter

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
    private ArrayList<HashMap<String, String>> arrayList;
    private Shpf shpf;
    public ListAdapter(ArrayList<HashMap<String, String>> arrayList, Shpf shpf) {
        this.arrayList = arrayList;
        this.shpf = shpf;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        // 將 HashMap 中的 "note" 資料設置到 TextView 中
        holder.noteTv.setText(arrayList.get(position).get("note"));
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                String noteRemove = arrayList.get(position).get("note");
                //獲取該筆記的內容
                arrayList.remove(position);
                //移除該項目
                notifyItemRemoved(position);
                //通知RecyclerView該項目已被移除
                notifyItemRangeChanged(position, arrayList.size());
                //更新剩餘項目
                shpf.removeNote(noteRemove);
                //從SharedPreferences中移除該筆記
                return true;
                //返回true表示事件已處理
            }
        });
        //設置長按事件來刪除項目
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    //ViewHolder類別,用來綁定item的View
    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView noteTv;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            // 綁定 TextView
            noteTv = itemView.findViewById(R.id.item_note_tv);
        }
    }
}

Shpf

public class Shpf {
    private String Note = "notebook";
    private String Notes = "notes";
    //SharedPreferences的key
    private SharedPreferences sharedPreferences;

    public Shpf(@NonNull Context context) {
        sharedPreferences = context.getSharedPreferences(Note, Context.MODE_PRIVATE);
    }//初始化SharedPreferences


    public void setName(String note) {
        ArrayList<String> notes = getAllNotes();
        //先獲取當前所有筆記
        notes.add(note);
        //添加新筆記到列表
        saveNotes(notes);
        //保存更新後的筆記列表
    }//保存新的筆記

    public void removeNote(String note) {
        ArrayList<String> notes = getAllNotes();
        if (notes.contains(note)) {
            notes.remove(note);
            saveNotes(notes);
            //保存更新後的筆記列表
        }
    }// 移除特定筆記

    public ArrayList<String> getAllNotes() {
        String notesString = sharedPreferences.getString(Notes, "");
        //從SharedPreferences獲取以逗號分隔的字符串
        if (notesString.isEmpty()) {
            return new ArrayList<>();
            //如果沒有數據,返回空的ArrayList
        } else {
            //將字符串轉換成ArrayList
            return new ArrayList<>(Arrays.asList(notesString.split(",")));
        }
    }//獲取所有的筆記


    private void saveNotes(ArrayList<String> notes) {
        StringBuilder notesString = new StringBuilder();
        for (String note : notes) {
            notesString.append(note).append(",");
        }//將ArrayList轉換成以逗號分隔的字符串
        if (notesString.length() > 0) {
            notesString.deleteCharAt(notesString.length() - 1);
            //移除最後一個逗號
        }
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(Notes, notesString.toString());
        editor.apply();
        //保存到SharedPreferences
    }//保存筆記列表
}

MainActivity

public class MainActivity extends AppCompatActivity {
    private EditText inputnoteEt;
    private Button saveBtn;
    private RecyclerView notelistRv;
    private ListAdapter listAdapter;
    private Shpf shpf;
    ArrayList<HashMap<String, String>> arrayList = new ArrayList<>();
    //用來存放多筆資料

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        inputnoteEt = findViewById(R.id.main_input_et);
        saveBtn = findViewById(R.id.main_save_btn);
        notelistRv = findViewById(R.id.main_notelist_rv);

        notelistRv.setLayoutManager(new LinearLayoutManager(this));
        notelistRv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        //设置RecyclerView的布局管理器

        shpf = new Shpf(this);
        //初始化SharedPreferences

        listAdapter = new ListAdapter(arrayList,shpf);
        notelistRv.setAdapter(listAdapter);
        //初始化ListAdapter並傳入數據

        loadData();
        //讀取SharedPreferences中的資料,並展示到RecyclerView

        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveNote();
                loadData();
                //每次新增資料後重新加載數據並刷新列表
            }
        });
    }//設置按鈕的點擊事件

    public void saveNote() {
        String note = inputnoteEt.getText().toString();
        if (!note.isEmpty()) {
            shpf.setName(note);
            //保存新的資料
            Toast.makeText(this, "已儲存", Toast.LENGTH_SHORT).show();
            inputnoteEt.setText("");
            //清空輸入框
        } else {
            Toast.makeText(this, "請輸入內容", Toast.LENGTH_SHORT).show();
        }
    }//儲存筆記到SharedPreferences


    private void loadData() {
        arrayList.clear();
        //清空當前列表
        ArrayList<String> notes = shpf.getAllNotes();
        //從SharedPreferences讀取所有資料
        for (String note : notes) {
            HashMap<String, String> hashMap = new HashMap<>();
            hashMap.put("note", note);
            arrayList.add(hashMap);
            //將每筆資料添加到列表中
        }
        listAdapter.notifyDataSetChanged();
        //通知適配器數據已變更
    }//從SharedPreferences中加載資料並更新RecyclerView
}

明天就是最後一天了
下一篇我會在加上一顆全部清除的按鈕


上一篇
[Day 28] 完成一個記事本app(上) - 新增功能
下一篇
[Day 30] 完成一個記事本app(下) - 清除功能 + 結語
系列文
深入Android Java程式語言 - 打造我的行動應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言