终生的小便签

by admin on 2019年9月8日

**欢迎访问我的个人博客转发请注明出处:
**一直想要写一个便签应用,因为我一直在用的是锤子便签和一加便签,觉得体验还是可以的,但是始终觉得自己也是可以做的,这段时间因为有些事情耽误了,项目前几天做好了,一直没有时间上传到github
(各位大爷路过给个star呗😉)
,今天趁着有时间顺便写了这篇文章,介绍一下写这个便签时遇到的一些问题,当作是跟大家一起分享吧!

   
 我读书的时候,一直以来都是名列前茅的,而和千万人想的一样,毕业后工作的平平,成了千万人茶余饭后的叹息,大家总觉得我是好大学毕业,应该考公务员,应该去政府上班,而不是辗转于各个私企间。面对铺天盖地而来的关心也好,问候也罢,最初我也难受过,尴尬过,苦恼过,可是怎么办呢?我没有考上公务员,我也没能考到事业单位,并且至今,我依然是某私企极其普通的一员。而我不同时期的同学,时不时有人告诉我他们高就的现状。

2017年8月7日

在工作中,我们经常会遇到一些小麻烦。而我最讨厌的就是正在做的事情被打断。但是,总会遇见一些不得不及时处理的事情,这种情况下,要怎么平衡呢?

  • 实现最基本的增加、删除、修改便签
  • 便签能够保存到本地
  • 主界面采用Material Design设计风格,相对美观
  • Recycle View上下滑动可以自动隐藏Toolbar,以及Floating Action Button
  • Recycle
    View的Item可以实现如QQ的侧滑效果,可以通过点击删除、置顶进行编辑
  • 可以设置便签为星✨,那么将会在便签界面左边增加一个红色的标志,以提醒用户此便签为重要便签
  • 变迁主界面标有时间,并且按照编辑时间从新到旧进行排列

     
 就在刚刚,我的大学同学告诉我,今年她们研究生毕业的人里,我的高中同学顺利签约某市某银行,我说不羡慕是假的,可是我的羡慕绝对不到我大学同学的百分之一,也许最大的原因是我已经结婚了,工作已经不再是我生活的重心了,甚至,我已经准备辞职去生孩子了。

我要多读一些书,有用的书

工作时间长了以后,工作流程已经了然于心,一切都应该很顺手。但是,好像总有那么多意外事件发生,好好的工作变得不那么得心应手,甚至经常出现日常工作都要急急忙忙才能完成。那么要怎么做才能让自己从容的应对日常的和意外的工作呢?

图片 1效果截图

       
我相信,在很多人眼里,我可能没有理想,没有出息,白读了很多年的书。可我觉得不然,我从来都清楚知道自己想要什么,并且敢于为自己想要的东西放弃另外一些也重要的东西,我觉得这不仅是勇气,更是魄力,这些,并不是人人都有的,哪怕硕士,博士。

尽量睡早一些

上面的情况应该大部分职场人都会遇到,我说说自己在应对这些状况时的小技巧。

Talk is cheap,show me your code

       
 我体质不好,很难废寝忘食去工作,而我深知,身体是一切的前提,所以我对待工作的态度向来是平庸的,不求有功,但求无过。但对待婚姻不同,我是全神贯注的。这可能源于我的老公也是全身心爱着我的。我的同学问我结婚后的感受,我说很好。真的很好,我觉得我们此时的感情,已经不再是十三四岁时的爱不爱那么简单了,我们的生命连在了一起,他成了我的血液和骨髓,成为我不可缺少的氧气,所以我怎么能不爱他呢?

番剧可以少看一些,毕竟不能静下心来看的效果很差

突发状况,这些事情没办法预料,但是日常工作内容自己是了然于心的。没打算预估突发事件,那么着眼点就在日常工作中了。一般来说,日常工作内容是占据不了每日八小时工作时间的。安排好了日常工作,剩下的弹性时间可以用来应对突发事件。

RecycleView是google在推出Material
Design时着重介绍的一个组件,它对传统的ListView已经可以说是完全代替了,功能强大是他的一个最大优点,但是有一点局限的就是我们自定义的RecycleView必须继承重写
RecyclerView.Adapter 和
RecyclerView.ViewHolder,虽然在里面我们可以随意重写方法,但是可以发现如果我们使用数据库作为数据源,RecyclerView.Adapter是无法支持读取Cursor的,但是开源的力量又再次显现了,直接给上github地址,但是我们这里只需要复用其中的两个文件就行了,容我娓娓道来。

         
也许我不是大家眼中的成功,可是什么样才是成功呢?谁敢说嫁个爱自己的老公不是一种能力呢?谁说相夫教子不是一项功德呢?我觉得从这个意义上来说,我是成功的。我为自己而活,不为世俗的眼光所累。我爱我自己,也爱我先生,谢谢他一直支持我,宠爱我,未来的苦或乐,我都愿意跟他一起携手走过。这就是我以为的幸福。

多听听力,因为英语听力的确很差

我最习惯的做法是简单安排工作流程。我的工作内容以月划分为一个周期。月初处理一部分事情,月中处理一部分事情,月末结束所有事情。有些工作内容有时间限制,那那些事情在规定时间内处理。其他工作尽量安排错开那个时间段。

1、添加下面的RecyclerViewCursorAdapter 和
CursorFilter到工程中
由于代码太长影响排版,我就直接附上下载链接RecyclerViewCursorAdapterCursorFilter

不想把自己弄得太沉重

工作内容多又杂,并且很细化,很容易漏掉,集中到月末,那真是比打仗还紧张。所以,便签就入了眼界。

2、新建自定义的Adapter并且继承RecyclerViewCursorAdapter

先看龙族,寒假再看九州,江南个骗子≡^ˇ^≡记得我在去年暑假的日记里就走盼着高考完能看到炽3,结果江南跑去搞电视剧了

每月的工作安排,全部罗列出来。每周的大概工作内容都粗略安排好。再细化到每天,每天早上花十分钟左右时间,安排好当天的工作内容。优先处理好便签上每日工作事项。突发事件,不急的直接在便签上添加,当天完成不了的,直接移到第二天。紧急的突发事件即时处理,把日常工作移到第二天。

  • NoteAdapter

白天可以多聊聊天,看看书,补一补英语,晚上再看番

说起来其实挺简单,一张便签条,谁不会?谁不会用?但是,在实际工作中,大部分人都习惯忽略记便签。小事一桩,立马结束,不需要记便签。事实就是,事情越小越简单越容易被遗漏。小事堆一起就成了耗费心思的大事了。

学着做饭,尽量勤快一些

我自己在工作时习惯把非常规项做笔记,写在便签纸上,同事并没有这个习惯,他们喜欢把工作做完就OK。有一次,领导找东西,只记得一个大概。死活找不着,经手同事也没有印象了。那次我们不得不搬出一年的文件来查找,几万张材料,那可不是小数目。耗费时间和精力,还给领导留下不好印象。

public class NoteAdapter extends RecyclerViewCursorAdapter<NoteAdapter.MyNoteViewHolder> { private Context mContext; private RecyclerViewOnItemClickListener mOnItemClickListener; private onSwipeListener mOnSwipeListener; public NoteAdapter(Context context,Cursor cursor,int flags) { super(context,cursor,flags); this.mContext = context; } @Override public MyNoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View root = LayoutInflater.from(parent.getContext.inflate(R.layout.note_row, parent, false); MyNoteViewHolder holder = new MyNoteViewHolder; return holder; } @Override public void onBindViewHolder(final MyNoteViewHolder holder, Cursor cursor) { int position = cursor.getPosition(); holder.tv.setText(cursor.getString(cursor.getColumnIndex(NoteDbAdapter.COL_CONTENT))); holder.tv_dateTime.setText(cursor.getString(cursor.getColumnIndex(NoteDbAdapter.COL_DATETIME))); holder.mRowtab.setBackgroundColor(cursor.getInt(cursor.getColumnIndex(NoteDbAdapter.COL_IMPORTANT)) == 1? mContext.getResources().getColor(R.color.colorAccent):mContext.getResources().getColor(android.R.color.white) ); holder.root.setTag; holder.tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClickListener(view, holder.getAdapterPosition; } } }); } @Override protected void onContentChanged() { } /** 设置点击事件 */ public void setRecyclerViewOnItemClickListener(RecyclerViewOnItemClickListener onItemClickListener) { this.mOnItemClickListener = onItemClickListener; } public RecyclerViewOnItemClickListener getOnItemClickListener() { return mOnItemClickListener; } /** 点击事件接口 */ public interface RecyclerViewOnItemClickListener { void onItemClickListener(View view, int position); } /** * 内部类Holder */ class MyNoteViewHolder extends RecyclerView.ViewHolder { private TextView tv; private TextView tv_dateTime; private View mRowtab; private Button btnTop; private Button btnDelete; private View root; public MyNoteViewHolder(View root) { super; this.root = root; tv =  root.findViewById(R.id.row_text); tv_dateTime =  root.findViewById(R.id.tv_note_time); mRowtab = root.findViewById(R.id.row_tab); btnTop =  root.findViewById(R.id.btnTop); btnDelete =  root.findViewById(R.id.btnDelete); } }}

开心一些,礼貌一些,努力一些,简单一些

习惯用便签,登记好工作事项,用完的便签按时间排列好。不需要的时候不占多大地方,需要的时候,它能帮上大忙。

3、在Activity中这样用

2017年8月

这是我在处理工作时的小技巧,那么,你有什么技巧分享呢?

mRecyclerView = (RecyclerView) findViewById(R.id.recycle_notes); mRecyclerView.setLayoutManager(new LinearLayoutManager; mCursor = mNoteDbAdapter.fetchAllNotes(); mNoteAdapter = new NoteAdapter(this, mCursor, 0); Log.d(TAG, "mCursor的大小为:" + mCursor.getCount; //设置点击事件 mNoteAdapter.setRecyclerViewOnItemClickListener(new NoteAdapter.RecyclerViewOnItemClickListener() { @Override public void onItemClickListener(View view, int position) { if (mCursor == null || mCursor.isClosed { if (mCursor == null) { Log.d("NoteActivity", "newCursor is null"); Toast.makeText(NoteActivity.this, "newCursor is null", Toast.LENGTH_SHORT).show(); } else if (mCursor.isClosed{ Log.d("NoteActivity", "newCursor is closed"); Toast.makeText(NoteActivity.this, "newCursor is null", Toast.LENGTH_SHORT).show(); } } else { mCursor.moveToPosition; String content = mCursor.getString(mCursor.getColumnIndex(NoteDbAdapter.COL_CONTENT)); int importtant = mCursor.getInt(mCursor.getColumnIndex(NoteDbAdapter.COL_IMPORTANT)); int id = mCursor.getInt(mCursor.getColumnIndex(NoteDbAdapter.COL_ID)); Log.d("NoteActivity", content + importtant); Note clickNote = new Note(id, content, importtant); Intent intent = new Intent(); intent.setClass(NoteActivity.this, NoteContentActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("note", clickNote); intent.putExtras; startActivity; } } }); //设置适配器 mRecyclerView.setAdapter(mNoteAdapter);

我很难过,我再也找不到想看的小说,再也画不出我想要的效果

思路很简单,只需要记录RecycleView向下滑动时移动的距离,超过一定范围时就会调用Toolbar以及Floating
Action
Button的animate().translationY方法,令其在Y轴方向上移动,当RecycleView向上滑动时又会反过来回到初始状态,并且当滑动到RecycleView底部时会强制Toolbar和FAB回到初始状态,上代码。

8月11日

  • HidingScrollListener

不管过了多久,还是以颓废之姿对待生活

public abstract class HidingScrollListener extends RecyclerView.OnScrollListener { private static final int HIDE_THRESHOLD = 20; private int scrolledDistance = 0; private boolean controlsVisible = true; private int mItemSize=0; public HidingScrollListener(int itemSize) { this.mItemSize = itemSize - 1; } /** * * @param recyclerView * @param dx 横向的滚动距离 * @param dy 纵向的滚动距离 * 记录的是两个滚动事件之间的偏移量,而不是总的滚动距离。 */ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager.findFirstVisibleItemPosition(); int lastVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager.findLastVisibleItemPosition(); if (firstVisibleItem == 0||lastVisibleItem==mItemSize) { if (!controlsVisible) { onShow(); controlsVisible = true; } }else{ //如果总的滚动距离超多了一定值 // (这个值取决于你自己的设定,越大,需要滑动的距离越长才能显示或者隐藏), // 我们就根据其方向显示或者隐藏Toolbar(dy>0意味着下滚,dy<0意味着上滚)。 if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) { onHide(); controlsVisible = false; scrolledDistance = 0; } else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) { onShow(); scrolledDistance = 0; controlsVisible = true; } } //计算出滚动的总距离, // 但是只在Toolbar隐藏且上滚或者Toolbar未隐藏且下滚的时候 if ((controlsVisible && dy > 0) || (!controlsVisible && dy < 0)) { scrolledDistance += dy; } } public abstract void onHide(); public abstract void onShow();}

在Avtivity中使用回掉方法

//为recycleview设置滚动监听器 mRecyclerView.setOnScrollListener(new HidingScrollListener(mCursor.getCount { @Override public void onHide() { hideView(); } @Override public void onShow() { showView; private void hideView() { mToolbar.animate().translationY( -mToolbar.getHeight.setInterpolator(new AccelerateInterpolator; FrameLayout.LayoutParams ip = (FrameLayout.LayoutParams) mFloatingActionButton.getLayoutParams(); int fabButtonMargin = ip.bottomMargin; mFloatingActionButton.animate().translationY( mFloatingActionButton.getHeight() + fabButtonMargin).setInterpolator(new AccelerateInterpolator.start(); } private void showView() { mToolbar.animate().translationY.setInterpolator(new DecelerateInterpolator; mFloatingActionButton.animate().translationY.setInterpolator(new DecelerateInterpolator.start(); }

特别注意布局文件如果你发现你运行的效果像下面的截图一样的话,那你肯定是因为布局文件上少写了这两句

android:clipToPadding="false"android:paddingTop="?attr/actionBarSize"

图片 2bug截图
完整的布局代码如下:

  • main_activity.xml

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:andro xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android: android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" android:paddingTop="?attr/actionBarSize" /> <android.support.v7.widget.Toolbar android: android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:clipToPadding="false" app:titleTextColor="@android:color/white" /> <android.support.design.widget.FloatingActionButton android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_marginBottom="16dp" android:layout_marginRight="16dp" android:src="@drawable/ic_action_new" android:elevation="15dp" app:fabSize="normal" app:pressedTranslationZ="8dp" app:rippleColor="#ff87eb" /></FrameLayout>

首先得谢谢张旭童
,他的一个库帮我解决了这个问题,点击这里可以访问他的项目。1、在布局文件中使用com.mcxtzhang.swipemenulib.SwipeMenuLayout布局,在ItemView后添加button表示删除置顶按钮。
2、在Adapter中设置打开侧滑菜单,并且可以设置菜单在左还是在右

((SwipeMenuLayout) holder.root.findViewById(R.id.swipeMenuLayout)).setIos.setLeftSwipe.setSwipeEnable;

3、在Activity中设置动作事件

 mNoteAdapter.setOnSwipeListener(new NoteAdapter.onSwipeListener() { @Override public void onDel { Toast.makeText(NoteActivity.this, "点击了第" +  + "条item的删除按钮", Toast.LENGTH_SHORT).show(); mCursor.moveToPosition; int id = mCursor.getInt(mCursor.getColumnIndex(NoteDbAdapter.COL_ID)); mNoteDbAdapter.deleteNoteById; mCursor = mNoteDbAdapter.fetchAllNotes(); mNoteAdapter.changeCursor; } @Override public void onTop { Toast.makeText(NoteActivity.this, "点击了第" +  + "条item的Top按钮", Toast.LENGTH_SHORT).show(); mCursor.moveToPosition; int id = mCursor.getInt(mCursor.getColumnIndex(NoteDbAdapter.COL_ID)); Note editNote = mNoteDbAdapter.fetchNoteById; editNote.setDateTime(DateUtil.formatDateTime; mNoteDbAdapter.updateNote; mCursor = mNoteDbAdapter.fetchAllNotes(); mNoteAdapter.changeCursor; } });

大功告成,如果想要看详细代码,或者有什么建议可以到Github上给我发Issue或者直接在站内给我留言哦,记得star哦

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图