• 一个带有富文本功能的记事本


    一个带有富文本功能的记事本
    已经好久没有写过博客了,果然不做项目,一直摸鱼是提不起写博客的兴趣的。但是做项目肝又很痛,就很矛盾,233.
    好了进入正题:
    今天,要贴的是一个带有富文本功能的记事本。也是我混进实验室考核的第一个项目。下面是要求:

    主界面:

    1. 要求能查看记事本的概览 (标题+一部分内容)
    2. 实现记事的搜索功能
    3. 默认按时间顺序进行笔记本排序

    编辑器:

    1. 带有富文本功能
    2. 要求实现的格式不少于 4 种(越多越好)
    3. 设计时候要考虑到,格式的保存方式
    4. 记录笔记最后修改时间

    回收站:

    1. 有删除单条的功能
    2. 有删除全部的功能
    3. 从回收站恢复(移出回收站)

    老规矩(也没什么老不老规矩的),先贴github地址(求star)
    https://github.com/egoistor/Nodepad
    然后呢,就是谢谢一些CSDN的作者:
    首先是https://www.jianshu.com/p/9c2c1416d894,我的富文本基本都是这里来的,当然自己也有学来着,毕竟蠢,还是多借鉴。
    然后是界面贴图:
    (https://img-blog.csdnimg.cn/20190131091218330.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_1,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_1,color_FFFFFF,t_1aGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_16,color_FFFFFF,t_70)
    (https://img-blog.csdnimg.cn/20190131091601723.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_16,color_FFFFFF,t_70)
    (https://img-blog.csdnimg.cn/20190131091700396.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Vnb2lzdG9y,size_16,color_FFFFFF,t_70)然后就说说自己这次出现的问题,首先习惯很 重要 重要 重要
    比如xml里每一个activity的title的hight如果没有设置正确,就会调试到怀疑人生。
    还有dialog的show()一定要写。
    然后就是在调试的时候灵活使用Logcat,真的很好用,可以看到自己的各种问题。
    还有就是LitePal真好用,真香。
    我唯一想说的代码问题就是在界面初始化数据库的时候,会出现问题:

    public void ininDataBase(){
            SharedPreferences sharedPreferences=this.getSharedPreferences("share",MODE_PRIVATE);
            boolean isFirstRun=sharedPreferences.getBoolean("isFirstRun", true);
            SharedPreferences.Editor editor=sharedPreferences.edit();
            if(isFirstRun){
                SQLiteDatabase db = LitePal.getDatabase();
                editor.putBoolean("isFirstRun", false);
                editor.commit();
            }else{
                noteList = LitePal.findAll(Note.class);
            }
        }
    

    就是这一片了,问题在于你要判断是否是activity第一次启动,如果是第一次就只初始化数据库,不对数据库进行取数据操作,毕竟没东西,程序会直接崩溃。具体的方法,我想代码已经说的很清楚了,使用 SharedPreferences 进行永久化的判断条件存储,就ok。

    这是一个大一点的问题

    还有一些小问题,比如什么RecycleView的条目的点击事件的添加,网上有蛮多教程都说的蛮清楚的,果然百度是个好东西。
    具体呢:

    public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener{
    
        private RecyclerViewOnItemClickListener onItemClickListener;
        private RecyclerViewOnItemLongClickListener onItemLongClickListener;
    
    
        private List<Note> myNoteList;
    
        static class ViewHolder extends RecyclerView.ViewHolder{
            private View view;
            TextView NoteName;
            TextView TimeShow;
    
            public ViewHolder(View view){
                super(view);
                this.view=view;
                NoteName = view.findViewById(R.id.note_message);
                TimeShow = view.findViewById(R.id.time_shows);
            }
        }
    
        public NoteAdapter(List<Note> noteList){
            myNoteList = noteList;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.note_item, parent, false);
            ViewHolder holder = new ViewHolder(view);
            view.setOnClickListener(this);
            view.setOnLongClickListener(this);
            return holder;
        }
    
        @Override
        public void onClick(View v) { if (onItemClickListener != null) {
            onItemClickListener.onItemClickListener(v, (Integer) v.getTag());
            }
        }
    
        @Override public boolean onLongClick(View v) {
            return onItemLongClickListener != null && onItemLongClickListener.onItemLongClickListener(v, (Integer) v.getTag());
        }
    
        public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
    
        }
        public void setOnItemLongClickListener(RecyclerViewOnItemLongClickListener onItemLongClickListener) {
            this.onItemLongClickListener = onItemLongClickListener;
        }
    
        public interface RecyclerViewOnItemClickListener {
            void onItemClickListener(View view, int position);
        }
    
        public interface RecyclerViewOnItemLongClickListener {
            boolean onItemLongClickListener(View view, int position);
        }
        @Override
    
        public void onBindViewHolder(final ViewHolder holder, int position) {
    
            Note Note = myNoteList.get(position);
            holder.NoteName.setText(Note.getMessage());
            holder.TimeShow.setText(Note.getYear()+"/"+Note.getMonth()+"/"+Note.getDay());
            holder.view.setTag(position);
        }
    
       
    
        @Override
        public int getItemCount() {
            return myNoteList.size();
        }
    }
    

    在adapter里先对接口进行声明,也就是如上代码。
    然后在activity里调用即可。

    最后呢,就是需要改进的地方。

    1. 当然是老生常谈的界面问题,界面丑陋,等我看完md,有时间回来修改。
    2. 插入图片是写死的,我虽然写了//TODO,但是懒得改了
    3. 其实是个大问题,按back键返回的时候,不会调用onCreate(),自然list不会刷新,我想了想应该调用onRestart(),什么时候改一下,看看。

    还有博友发现了其他问题,欢迎提出。

  • 相关阅读:
    Redis哨兵模式 (sentinel) (主从复制,读写分离)
    字符串的全排列
    测试链接
    vue数组能触发视图更新的方法
    PyCharm Shortcuts of macOS
    Tweak SecureCRT for macOS
    rsyslogd 以及日志轮替 logrotate
    阿里云服务器常见操作
    sh 启动jar
    招募军队(最小生成树)
  • 原文地址:https://www.cnblogs.com/egoistor/p/10340585.html
Copyright © 2020-2023  润新知