Android(安卓)仿iphone提醒事项(一)
16lz
2021-01-26
最近用android仿写了一下iphone提醒事项,可动态实现表增加和数据增加,效果如下:
主要难点在第一页的动画实现和数据的存储交互。
看界面分析先将单个列表封装成一个自定义的view(ListStyleView.java),该view布局为:list_style_item.xml , 它的里面有个listview
由于每个列表里面可以动态添加数据,为列表里面的listview添加footview,用来添加数据 View footView = TestActivity.mTestActivity.getLayoutInflater().inflate(R.layout.item_footview, null);
detailsList.addFooterView(footView);
该自定义view为:
package com.iphone.reminder.view;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.TextView;import com.iphone.reminder.R;import com.iphone.reminder.activity.ChooseColorActivity;import com.iphone.reminder.activity.MainActivity;import com.iphone.reminder.activity.TestActivity;import com.iphone.reminder.adapter.MyApater;import com.iphone.reminder.data.MessageBean;import com.iphone.reminder.listview.ListViewCompat;import com.iphone.reminder.sqlite.SQLHelper;import com.iphone.reminder.util.Utils;import java.util.ArrayList;public class ListStyleView extends LinearLayout {private ListViewCompat detailsList;public MyApater mYAdpter;private TextView mColorChooseTv, titleDescriptionTv;private View colorChooseLine;public static boolean isEditStatus = false;private boolean isShowDoneList = true;private ImageView footviewTv;private EditText mFootViewET;private int currentTableCount = 1;private boolean isAddNewDetailTitle = false;// 点击加号那一行加一个新的消息public Button mEditOrDoneButton, mDeleteListBt;public EditText listTitleEt; public TextView listTitleTv; public ImageView alarmIv; public TextView listCountTv; private SharedPreferences settingSP; public ListStyleView(final Context context,ArrayList mMessageList, int tableCount) {// tableCount// 1:表一 2:表二super(context);currentTableCount = tableCount;LayoutInflater.from(context).inflate(R.layout.list_style_item, this);detailsList = (ListViewCompat) findViewById(R.id.details_list);listTitleEt = (EditText) findViewById(R.id.list_title_et); listTitleTv =(TextView) findViewById(R.id.list_title_tv);listCountTv = (TextView) findViewById(R.id.list_count_tv);titleDescriptionTv = (TextView) findViewById(R.id.title_description_tv);mEditOrDoneButton = (Button) findViewById(R.id.edit_or_done);mColorChooseTv = (TextView) findViewById(R.id.color_choose_tv);colorChooseLine = (View) findViewById(R.id.color_choose_line);mDeleteListBt = (Button) findViewById(R.id.delete_list_tv); alarmIv = (ImageView) findViewById(R.id.alarm_iv); if(tableCount==1){ alarmIv.setVisibility(View.VISIBLE); listCountTv.setVisibility(View.GONE); mEditOrDoneButton.setVisibility(View.GONE); }View footView = TestActivity.mTestActivity.getLayoutInflater().inflate(R.layout.item_footview, null);footviewTv = (ImageView) footView.findViewById(R.id.footview_iv);mFootViewET = (EditText) footView.findViewById(R.id.footview_et); settingSP = getContext().getSharedPreferences(Utils.TABLE_TITLE, 0);mFootViewET.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {if (mFootViewET.getText().length() != 0) { mEditOrDoneButton.setVisibility(View.VISIBLE);mEditOrDoneButton.setText(getContext().getResources().getString(R.string.done));isAddNewDetailTitle = true;} else { if(currentTableCount!=1) { mEditOrDoneButton.setText(getContext().getResources().getString(R.string.edit)); }isAddNewDetailTitle = false;}}@Overridepublic void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {}@Overridepublic void afterTextChanged(Editable arg0) {}});mFootViewET.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) { mFootViewET.setFocusable(true);mEditOrDoneButton.setText(getContext().getResources().getString(R.string.done)); if (mFootViewET.getText().length() != 0) { isAddNewDetailTitle = true; }}});mColorChooseTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Intent intent = new Intent();intent.setClass(TestActivity.mTestActivity,ChooseColorActivity.class);intent.putExtra("TABLE_COUNT", currentTableCount);context.startActivity(intent);}});setListViewHeightBasedOnChildren(detailsList);mEditOrDoneButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (isAddNewDetailTitle) {// 新增加消息操作 if(mFootViewET.getText().toString().length()!=0){mFootViewET.clearFocus();mEditOrDoneButton.setText(getContext().getResources().getString(R.string.edit));SQLHelper.createSql(getContext());SQLHelper.insertSqlite(getContext(), mFootViewET.getText().toString(), "", "", "", currentTableCount,1,0);mYAdpter.notifyDataSetChanged();mYAdpter.setmMessageItems(Utils.addDetailsDate(getContext(), currentTableCount));mYAdpter.notifyDataSetChanged();mFootViewET.setText("");listCountTv.setText(""+mYAdpter.getCount()); Utils.hideImm(); }else{ mEditOrDoneButton.setText(getContext().getResources().getString(R.string.edit)); Utils.hideImm(); }} else { mFootViewET.clearFocus();editClick();}}});detailsList.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_MOVE) {MainActivity.mScrollView.requestDisallowInterceptTouchEvent(true);}return false;}});mDeleteListBt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {if (!isEditStatus) {if (isShowDoneList) {mDeleteListBt.setText(getContext().getResources().getString(R.string.hide_completed)); Utils.isShow = true;} else {mDeleteListBt.setText(getContext().getResources().getString(R.string.show_completed)); Utils.isShow = false;} mYAdpter.setmMessageItems(Utils.addDetailsDate( getContext(), currentTableCount)); mYAdpter.notifyDataSetChanged();isShowDoneList = !isShowDoneList;} else {// 删除列表操作 MainActivity.mainActivity.deleteTable(currentTableCount); isEditStatus = !isEditStatus;}}});detailsList.addFooterView(footView);mYAdpter = new MyApater(getContext(), tableCount);detailsList.setAdapter(mYAdpter);mYAdpter.setmMessageItems(mMessageList);listCountTv.setText("" + mYAdpter.getCount());}public void initDetailHead(String listTitle, int listColor , String titleDescription) {listTitleEt.setText(listTitle);listTitleEt.setTextColor(listColor); listTitleTv.setText(listTitle); listTitleTv.setTextColor(listColor);listCountTv.setTextColor(listColor); titleDescriptionTv.setText(titleDescription); titleDescriptionTv.setTextColor(listColor);}public void isEditShow(boolean isEditShow) {if (isEditShow&¤tTableCount!=1) {mEditOrDoneButton.setVisibility(View.VISIBLE);} else {mEditOrDoneButton.setVisibility(View.INVISIBLE);}}public void setTitleColor(int color){listTitleEt.setTextColor(color); listTitleTv.setTextColor(color);listCountTv.setTextColor(color);}public void editClick() {if (!isEditStatus) {mEditOrDoneButton.setText(getContext().getResources().getString(R.string.done));colorChooseLine.setVisibility(View.VISIBLE);mColorChooseTv.setVisibility(View.VISIBLE);mDeleteListBt.setText(getContext().getResources().getString(R.string.delete_list));mDeleteListBt.setTextColor(0xfffe3b30); listTitleEt.setVisibility(View.VISIBLE); Log.d("cfb","Utils.isHideOrShowImm(listTitleEt)=if="+Utils.isHideOrShowImm(listTitleEt)); if(Utils.isHideOrShowImm(listTitleEt)){ } listTitleTv.setVisibility(View.GONE); listTitleEt.setText(settingSP.getString(Utils.TABLE_TITLE_KEY + currentTableCount, "")); } else { Log.d("cfb","editClick()--else===="+listTitleEt.getText().toString()); settingSP.edit().putString("TITLE"+currentTableCount, listTitleEt.getText().toString()).commit();mEditOrDoneButton.setText(getContext().getResources().getString(R.string.edit));colorChooseLine.setVisibility(View.GONE);mColorChooseTv.setVisibility(View.GONE);if (isShowDoneList) {mDeleteListBt.setText(getContext().getResources().getString(R.string.show_completed)); Utils.isShow = true;} else {mDeleteListBt.setText(getContext().getResources().getString(R.string.hide_completed)); Utils.isShow = false;} mDeleteListBt.setTextColor(0xff007afe); listTitleEt.setVisibility(View.GONE); listTitleTv.setVisibility(View.VISIBLE); listTitleTv.setText(settingSP.getString("TITLE"+currentTableCount,"")); Log.d("cfb","Utils.isHideOrShowImm(listTitleEt)=else="+Utils.isHideOrShowImm(listTitleEt)); if(Utils.isHideOrShowImm(listTitleEt)){ Utils.hideImm(); }}isEditStatus = !isEditStatus;}/** * 动态设置ListView的高度 * * @param listView */public static void setListViewHeightBasedOnChildren(ListView listView) {if (listView == null)return;ListAdapter listAdapter = listView.getAdapter();if (listAdapter == null) {// pre-conditionreturn;}int totalHeight = 0;for (int i = 0; i < listAdapter.getCount(); i++) {View listItem = listAdapter.getView(i, null, listView);listItem.measure(0, 0);totalHeight += listItem.getMeasuredHeight();}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));listView.setLayoutParams(params);}}
该表里面还有个自定义的ListView,该listview支持滑动删除
package com.iphone.reminder.listview;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.ListView;import com.iphone.reminder.activity.TestActivity;import com.iphone.reminder.data.MessageBean;import com.iphone.reminder.util.Utils;public class ListViewCompat extends ListView {private static final String TAG = "ListViewCompat";private SlideView mFocusedItemView;public ListViewCompat(Context context) {super(context);}public ListViewCompat(Context context, AttributeSet attrs) {super(context, attrs);}public ListViewCompat(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public void shrinkListItem(int position) {View item = getChildAt(position);if (item != null) {try {((SlideView) item).shrink();} catch (ClassCastException e) {e.printStackTrace();}}}@Overridepublic boolean onTouchEvent(MotionEvent event) {float downY=0.0f;switch (event.getAction()) {case MotionEvent.ACTION_DOWN: {int x = (int) event.getX();int y = (int) event.getY();downY = event.getY();int position = pointToPosition(x, y);Log.e(TAG, "postion=" + position);if (position != INVALID_POSITION && position!=getCount()-1) {MessageBean data = (MessageBean) getItemAtPosition(position);mFocusedItemView = data.slideView;Log.e(TAG, "FocusedItemView=" + mFocusedItemView);}}break;case MotionEvent.ACTION_MOVE: {float moveY = Math.abs(event.getY()-downY);if(moveY>30 && Utils.isSoftShowing(TestActivity.mTestActivity)){ Utils.hideImm();}}break;default:break;}if (mFocusedItemView != null) {mFocusedItemView.onRequireTouchEvent(event);}return super.onTouchEvent(event);}}
到这里就是单张列表的实现了。 更多相关文章
- android 数据备份
- Android(安卓)SQLite批量插入数据速度解决方案
- Android(安卓)数据库更新
- Android应用框架之数据库框架Room简介
- 数据共享之Android中用Application类实现全局数据变量的使用
- Android(安卓)RecyclerView单点、批量数据元素项目item的增加、
- Android(安卓)Studio--文件存储
- Android学习笔记:Preference的使用
- Android-利用SharedPreferences实现记住密码和账号功能