开发随笔:界面、推荐逻辑优化(文末小彩蛋)

开发随笔,小结项目开发中的得与失,项目优化工作,用到了以下几个知识点,在这里和大家分享一下:

进展-界面、推荐逻辑优化:

layout_margin、layout_height微调,对界面精雕细琢:

android:layout_margin="2dp"

双指针优化,不能直接赋值,否则游标联动,大坑:

                Cursor cursor = db.query("Room", null, null, null, null, null,
                        "name,time");
                Cursor cursorNext = db.query("Room", null, null, null, null, null,
                        "name,time");

对推荐功能的逻辑进行简简化,辅以Log调试,测试通过:

 suggest_btn_suggest = (Button) findViewById(R.id.suggest_btn_suggest);
        suggest_btn_suggest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                Cursor cursor = db.query("Room", null, null, null, null, null,
                        "name,time");
                Cursor cursorNext = db.query("Room", null, null, null, null, null,
                        "name,time");
                //public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
                if (cursor.moveToFirst() && cursorNext.moveToFirst()) {
                    do {
                        String local = cursor.getString(cursor
                                .getColumnIndex("local"));
                        String time = cursor.getString(cursor
                                .getColumnIndex("time"));
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                         Log.d("权兴权意-Cursor", "name-" + name + " time-" + time + " local-" + local);
                        String localArray[] = local.split("-");
                        String timeArray[] = time.split("-");
//                        Log.d(TAG, name + "-localArray[0]:" + localArray[0] + ",mLou:" + mLou + ",localArray[1]" + localArray[1] + ",mCeng:" + mCeng);
                        if(localArray[0].equals(mLou) && localArray[1].equals(mCeng)){//楼层匹配

                            //1.会议室为空,无会议,直接预订;
                            if (time.equals("")){
                                roomName = name;
                                roomLocal = local;
                                break;
                            }else{
                             //2.会议室非空
                                mStartTime = FormatTime(mStartHour) + ":" + FormatTime(mStartMinute);//预订会议开始时间
                                mEndTime = FormatTime(mEndHour) + ":" + FormatTime(mEndMinute);//预订会议结束时间
//                                Log.d(TAG, "mStartTime:" + mStartTime + ",mEndTime:" + mEndTime);
//                                Log.d(TAG, "cursorNext.moveToPosition cursor.getPosition() + 1:" + cursorNext.moveToPosition(cursor.getPosition() + 1));
//                                Log.d(TAG, "cursorNext.getString(cursorNext.getColumnIndex(\"name\")):" + cursorNext.getString(cursorNext.getColumnIndex("name")));
//                                Log.d(TAG, "cursor.getString(cursor.getColumnIndex(\"name\")):" + cursor.getString(cursor.getColumnIndex("name")));
                                //2.1会议室只有一场会议
                                if(!cursorNext.moveToPosition(cursor.getPosition() + 1) || !cursorNext.getString(cursorNext.getColumnIndex("name")).equals(cursor.getString(cursor.getColumnIndex("name")))){
                                    //预订会议结束时间早于原会议开始时间或者预订会议开始时间晚于原会议结束时间
                                    Log.d(TAG, "timeArray[0]:" + timeArray[0] + "timeArray[1]:" + timeArray[1]);
                                    if(mEndTime.compareTo(timeArray[0]) < 0 || mStartTime.compareTo(timeArray[1]) > 0){
                                        roomName = name;
                                        roomLocal = local;
                                        //Log.d(TAG, "2.1会议室只有一场会议:" + roomName + roomLocal);
                                        break;
                                    }
                                }

                                //2.2.会议室有多场会议,遍历操作,区间:
                                //将会议室会议根据时间按降序排列A,B,取区间如图A-C-B,
                                //C的开始时间晚于A的结束时间,
                                //C的结束时间早于B的开始时间,
                                if(mStartTime.compareTo(timeArray[1]) > 0 && cursorNext.moveToPosition(cursor.getPosition() + 1)){
                                    if(name.equals(cursorNext.getString(cursor.getColumnIndex("name")))){
                                        String timeNext = cursorNext.getString(cursor
                                                .getColumnIndex("time"));
                                        String timeArrayNext[] = timeNext.split("-");
                                        if(timeArrayNext[0].compareTo(mEndTime) > 0){
                                            roomName = name;
                                            roomLocal = local;
                                            break;
                                        }
                                    }
                                }
                            }
                        }

//                        Log.d("权兴权意:", "nameCur-" + nameCur);
//                        Log.d("权兴权意:", "passwordCur-" + passwordCur);
//                        Log.d("权兴权意:", "idCur-" + idCur);
                    } while (cursor.moveToNext());
                }
                cursor.close();
                db.close();

                Intent intent = new Intent();
                intent.setClass(SuggestActivity.this, RoomListActivity.class);
                intent.putExtra("roomName",roomName);
                intent.putExtra("roomLocal",roomLocal);
                startActivity(intent);
            }
        });

AS插件,见文末小彩蛋。

属性动画,见另一篇博客。

小结:

进展-界面、推荐逻辑优化:

layout_margin、layout_height微调;

双指针优化,简化情况,Log调试;

AS插件,属性动画。

文末小彩蛋:

Android Studio安装插件的方式其实和Eclipse大同小异。废话不多说,直接上图:

区域1:你当前已经安装了的插件

区域2:在线安装

区域3:从硬盘安装,即针对你已经下载好了的插件,可通过这项选择到你下好的插件,进行安装。

还有一个Install JetBrains plugin其实和区域2是一样的,只是这边将JetBrains类型的插件放一起了,便于安装而已。

这边再讲下区域2,点击出现下图,可以直接在输入框中搜索你要安装的插件,然后点击右边的install按键即可。

比如我要安装Findbugs:

最后附上推荐模块核心源代码,欢迎交流:

package com.quan.car.qmeeting;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.TimePicker;

import utils.MyDatabaseHelper;

/**
 * Created by 权兴权意 on 2016/8/23.
 */
public class SuggestActivity extends Activity{

    private TimePicker startTime_tp_suggest;
    private TimePicker endTime_tp_suggest;
    private TextView time_tv_suggest;
    private Button yesTime_btn_suggest;
    private int mStartHour;
    private int mStartMinute;
    private int mEndHour;
    private int mEndMinute;
    private String mStartTime;
    private String mEndTime;

    private RadioGroup lou_rg_suggest;
    private RadioGroup ceng_rg_suggest;
    private TextView floor_tv_suggest;
    private Button yesFloor_btn_suggest;
    private String mLou;
    private String mCeng;

    private Button suggest_btn_suggest;
    private MyDatabaseHelper dbHelper;

    private String roomName;
    private String roomLocal;

    private static final String TAG = "SuggestActivity";

//    private static final String TAG = "SuggestActivity";

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

//        Log.d(TAG, "onCreate: ");
//        Log.d(TAG, "onCreate() called with: " + "savedInstanceState = [" + savedInstanceState + "]");

//        Intent i = getIntent();
//        roomName = i.getStringExtra("roomName");
//        roomLocal = i.getStringExtra("roomLocal");

        dbHelper = new MyDatabaseHelper(this, "Meeting.db", null, MyDatabaseHelper.DB_VERSION);

        time_tv_suggest = (TextView) findViewById(R.id.time_tv_suggest);
        startTime_tp_suggest = (TimePicker) findViewById(R.id.startTime_tp_suggest);
        startTime_tp_suggest.setIs24HourView(true);

        startTime_tp_suggest.setCurrentHour(startTime_tp_suggest.getCurrentHour());
        startTime_tp_suggest.setCurrentMinute(startTime_tp_suggest.getCurrentMinute());

        startTime_tp_suggest.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                mStartHour = hour;
                mStartMinute = minute;
            }
        });
        endTime_tp_suggest = (TimePicker) findViewById(R.id.endTime_tp_suggest);
        endTime_tp_suggest.setIs24HourView(true);
        endTime_tp_suggest.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hour, int minute) {
                mEndHour = hour;
                mEndMinute = minute;
            }
        });

        yesTime_btn_suggest = (Button) findViewById(R.id.yesTime_btn_suggest);
        yesTime_btn_suggest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                time_tv_suggest.setText(new StringBuffer().append(" ").append(FormatTime(mStartHour))
                        .append(":").append(FormatTime(mStartMinute))
                        .append("-").append(FormatTime(mEndHour))
                        .append(":").append(FormatTime(mEndMinute)));
            }
        });

        floor_tv_suggest = (TextView) findViewById(R.id.floor_tv_suggest);
        lou_rg_suggest = (RadioGroup) findViewById(R.id.lou_rg_suggest);
        lou_rg_suggest.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int id) {
                switch (id){
                    case R.id.e11_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "E11", Toast.LENGTH_SHORT).show();
                        mLou = "E11";
                        break;
                    case R.id.e13_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "E13", Toast.LENGTH_SHORT).show();
                        mLou = "E13";
                        break;
                    default:
                        break;
                }
            }
        });
        ceng_rg_suggest = (RadioGroup) findViewById(R.id.ceng_rg_suggest);
        ceng_rg_suggest.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int id) {
                switch (id){
                    case R.id.ceng1_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "1", Toast.LENGTH_SHORT).show();
                        mCeng = "1";
                        break;
                    case R.id.ceng2_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "2", Toast.LENGTH_SHORT).show();
                        mCeng = "2";
                        break;
                    case R.id.ceng3_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "3", Toast.LENGTH_SHORT).show();
                        mCeng = "3";
                        break;
                    case R.id.ceng4_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "4", Toast.LENGTH_SHORT).show();
                        mCeng = "4";
                        break;
                    case R.id.ceng5_rb_suggest:
                        //Toast.makeText(SuggestActivity.this, "5", Toast.LENGTH_SHORT).show();
                        mCeng = "5";
                        break;
                    default:
                        break;
                }
            }
        });
        yesFloor_btn_suggest = (Button) findViewById(R.id.yesFloor_btn_suggest);
        yesFloor_btn_suggest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                floor_tv_suggest.setText(new StringBuffer().append(" ").append((mLou))
                        .append("-").append(mCeng));
                //roomLocal = mLou + "-" + mCeng;
            }
        });

        suggest_btn_suggest = (Button) findViewById(R.id.suggest_btn_suggest);
        suggest_btn_suggest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                Cursor cursor = db.query("Room", null, null, null, null, null,
                        "name,time");
                Cursor cursorNext = db.query("Room", null, null, null, null, null,
                        "name,time");
                //public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
                if (cursor.moveToFirst() && cursorNext.moveToFirst()) {
                    do {
                        String local = cursor.getString(cursor
                                .getColumnIndex("local"));
                        String time = cursor.getString(cursor
                                .getColumnIndex("time"));
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                         Log.d("权兴权意-Cursor", "name-" + name + " time-" + time + " local-" + local);
                        String localArray[] = local.split("-");
                        String timeArray[] = time.split("-");
//                        Log.d(TAG, name + "-localArray[0]:" + localArray[0] + ",mLou:" + mLou + ",localArray[1]" + localArray[1] + ",mCeng:" + mCeng);
                        if(localArray[0].equals(mLou) && localArray[1].equals(mCeng)){//楼层匹配

                            //1.会议室为空,无会议,直接预订;
                            if (time.equals("")){
                                roomName = name;
                                roomLocal = local;
                                break;
                            }else{
                             //2.会议室非空
                                mStartTime = FormatTime(mStartHour) + ":" + FormatTime(mStartMinute);//预订会议开始时间
                                mEndTime = FormatTime(mEndHour) + ":" + FormatTime(mEndMinute);//预订会议结束时间
//                                Log.d(TAG, "mStartTime:" + mStartTime + ",mEndTime:" + mEndTime);
//                                Log.d(TAG, "cursorNext.moveToPosition cursor.getPosition() + 1:" + cursorNext.moveToPosition(cursor.getPosition() + 1));
//                                Log.d(TAG, "cursorNext.getString(cursorNext.getColumnIndex(\"name\")):" + cursorNext.getString(cursorNext.getColumnIndex("name")));
//                                Log.d(TAG, "cursor.getString(cursor.getColumnIndex(\"name\")):" + cursor.getString(cursor.getColumnIndex("name")));
                                //2.1会议室只有一场会议
                                if(!cursorNext.moveToPosition(cursor.getPosition() + 1) || !cursorNext.getString(cursorNext.getColumnIndex("name")).equals(cursor.getString(cursor.getColumnIndex("name")))){
                                    //预订会议结束时间早于原会议开始时间或者预订会议开始时间晚于原会议结束时间
                                    Log.d(TAG, "timeArray[0]:" + timeArray[0] + "timeArray[1]:" + timeArray[1]);
                                    if(mEndTime.compareTo(timeArray[0]) < 0 || mStartTime.compareTo(timeArray[1]) > 0){
                                        roomName = name;
                                        roomLocal = local;
                                        //Log.d(TAG, "2.1会议室只有一场会议:" + roomName + roomLocal);
                                        break;
                                    }
                                }

                                //2.2.会议室有多场会议,遍历操作,区间:
                                //将会议室会议根据时间按降序排列A,B,取区间如图A-C-B,
                                //C的开始时间晚于A的结束时间,
                                //C的结束时间早于B的开始时间,
                                if(mStartTime.compareTo(timeArray[1]) > 0 && cursorNext.moveToPosition(cursor.getPosition() + 1)){
                                    if(name.equals(cursorNext.getString(cursor.getColumnIndex("name")))){
                                        String timeNext = cursorNext.getString(cursor
                                                .getColumnIndex("time"));
                                        String timeArrayNext[] = timeNext.split("-");
                                        if(timeArrayNext[0].compareTo(mEndTime) > 0){
                                            roomName = name;
                                            roomLocal = local;
                                            break;
                                        }
                                    }
                                }
                            }
                        }

//                        Log.d("权兴权意:", "nameCur-" + nameCur);
//                        Log.d("权兴权意:", "passwordCur-" + passwordCur);
//                        Log.d("权兴权意:", "idCur-" + idCur);
                    } while (cursor.moveToNext());
                }
                cursor.close();
                db.close();

                Intent intent = new Intent();
                intent.setClass(SuggestActivity.this, RoomListActivity.class);
                intent.putExtra("roomName",roomName);
                intent.putExtra("roomLocal",roomLocal);
                startActivity(intent);
            }
        });
//        Toast.makeText(SuggestActivity.this, "SuggestActivity--" + mHour + ":" + mMinute,
//                Toast.LENGTH_SHORT).show();
    }

    private String FormatTime(int time){
        String s = Integer.toString(time);
        if(s.length() == 1){
            s = "0" + s;
        }
        return s;
    }
}

时间: 2024-10-06 00:40:11

开发随笔:界面、推荐逻辑优化(文末小彩蛋)的相关文章

这个秋季过关斩将—设计模式,分布式,多线程(文末有彩蛋)

一.前言 今天为什么要谈论这个话题昵?想必大家都知道了,又到一年的中跳槽季了,肯定有一些小伙伴寂寞难耐,想出去搞事情了.在此,我抛出三个词,这三词应该归属面试最热词的范畴了,这是我自身体会及从各个同行公认的.下面我简单概述一下,希望对大伙有所帮助. 二.设计模式 概念 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计模式使代码编写真正工程化:设计模式是软件工

如何创建自解压格式的压缩包 [ 每周小技巧 12月27日 ] - 文末有彩蛋哟 ~

文:天析 项目责编:天析 项目说明:每周分享一个  [ 生活 / 学习 ]  小技巧,并于责编审核通过后于周四发布至博客或微信公众号! 本周小编给大家带来的第一个小技巧是创建自解压格式的压缩包,对于喜欢制作应用软件安装包的人来说,这是一个比较实用的小技巧,特别是对那些不会使用专门的“封装工具”的人来说,这是一个居家必备小技能! 话不多说,先上满满的干货! 这是要制作的安装包根目录 这个软件对于爱好刷机的人来说,想必是非常熟悉,被称之为“反向映射工具”,但他的功能远远不止如此,具体的大家自己去百度

Android 之文件存储(文末有彩蛋)

1. I/O流分为 字节流 和 字符流. 字节流:InputStream.OutputStream(输入流.输出流) 字符流:Reader.Writer(输入流.输出流) 注:1 字符 = 2 字节 缓冲流:BufferedReader.BufferedWriter(缓冲输入.输出流) 2. 打开数据库:sqlite3: 3. 修改文件权限:chomd   例:chomd+ 777 +文件名 4. Android SQLite 判断数据库中的文件为空 //查询数据 public void que

【文末有彩蛋】HTTPS加密时代,SSL证书该怎么挑选?

近年来,在各大互联网巨头以及相关政策法律的推动下,HTTPS的使用率逐年持续增长,数据表明,截止到2019年2月,在Alexa所列举的排名前100万网站中,超过58%的网站升级到了HTTPS.(见下图) 为什么部署HTTPS变得如此重要? 随着互联网的迅猛发展,相应的网络环境也变得愈加复杂多变.危机四伏-- 在利益的驱动下,一些恶意的运营商经常对用户的HTTP请求做劫持和篡改,假使一个网站现在还在用HTTP为用户提供服务,那一定会经常遇到网站被插入广告.泄露数据等问题. 而让大量信息完全透明地在

Vue源码中compiler部分逻辑梳理(内有彩蛋)

目录 一. 简述 二. 编译流程 三. 彩蛋环节 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 一. 简述 compiler模块Vue框架中用于模板编译的,它的作用就是将Vue中的组件模板转换成render函数,render函数在运行时可以生成虚拟节点vnode,它是Vue中虚拟DOM树的基本实现流程.完整版的Vue是包含runtime和compiler的,

Visual Studio 实用扩展推荐   Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源)。在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率。 C# outline   Visual Studio 默认的大纲方案只允许在方法级别及以上进行代码的折叠,无法对一个if、while的区块进行折叠

Visual Studio 实用扩展推荐 Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# outline Visual Studio 默认的大纲方案只允许在方法级别及以上进行代码的折叠,无法对一个if.while的区块进行折叠,而这款工具则正好弥补了这个问题. highlight all occurrences of selected word

Android:应用开发进阶必经之路之性能优化(上)

前言 性能优化在一款产品的迭代过程中非常重要:程序实现了功能.还原产品原型只能保证程序能用,但如果要让用户更愿意使用,产品得好用.试想一下如果你开发的产品启动慢.页面显示需要长时间转圈加载.页面切换卡顿.黑白屏.用一会机器就发烫.耗内存.OOM.程序切换到后台后占用内存无法释放......,这些问题就像正在玩游戏时弹出提示框这类糟糕的用户体验一样让用户恼火,如果用户不得不使用你的产品,可能还会一直忍受:但如果有很多同类竞品,糟糕的用户体验会大大影响留存率.有时候产品在市场上的表现差,真不能全怪产

告别“臃肿”,选择微服务(文末福利)

点击标题下「异步社区」可快速关注 参与文末话题讨论,每周赠送异步图书 --异步小编 一直以来,系统的架构设计是IT领域经久不衰的话题,也是构建每一个系统最核心且重要的部分之一.它决定了系统能否满足业务.技术.组织.灵活.可扩展性等多种要求,同时肩负起了解放程序员生产力的作用. 2016年底,由于业务的不断发展,我所在公司维护的项目也越来越"臃肿".随着无数个版本的迭代,以及开发人员的不断增加,开发效率越来越低,每次投产的人力成本和时间成本都逐渐增加,我们一直在思索如何能破局.评估了各种

【Mood-12】Android开发相关书籍推荐

新年伊始,找到Android进阶干货若干,2015拜读. 1.Android应用UI设计模式 目前,谷歌Android操作系统在移动市场中风头正劲,并且未来发展势不可挡.<Android应用UI设计模式>面向Android 4.0+操作系统,是市面上第一本深入解析Android界面设计的佳作.<Android应用UI设计模式>从适用于移动设备和平板的通用模式以及 Android UI设计指南出发,深入探讨了58种重要的Android交互设计模式及其应用.每种模式登场之前,先用基本知