发现----Android Demo
时间悄悄的走,转眼来实习已经三个月了,三个月的时间,小编慢慢的成长着,从刚开始的电商项目到现在的车段子项目,小编在走过一个又一个项目的同时,走过了一个又一个战胜自己的奇迹,每次遇到一个新的技术点,小编就开始捣鼓,捣鼓这回事,真的需要勇气,捣鼓捣鼓,duang,功能出来了,好开心`(*∩_∩*)′,能力往往是做了才会获得,而不是有了能力才去做,丫头加油。小伙伴们可能都在某些app上看见过发现的功能,点击发现的按钮自动加载最热门的信息,在小编最近捣鼓的项目里面就有这个功能,经过几天的捣鼓,终于新鲜出炉了,今天这篇博客小编就来简单的介绍一下如何点击发现按钮,自动加载我们所需要的相关信息,希望可以帮助到需要的小伙伴们,还请小伙伴多多指教`(*∩_∩*)′。
首先,我们来编写我们的实体层,需要用到两个实体,第一个content如下所示:
package com.jczb.car.bean; import java.util.Date; import java.util.List; import android.R.integer; import android.R.integer; /** * 说明:段子内容实体 * 作者:丁国华 * 时间:2015年9月10日 10:41:43 */ @SuppressWarnings("serial") public class Content extends Entity { /** 内容表标识 */ private int uid; /** 显示标题 */ private String title; /** 视频或者图片路径 */ private String path; /**详情*/ private String details; /**频道类型*/ private String channelType; /**频道名称*/ private String channelName; /**作者*/ private String author; /**是否推荐*/ private String isRecommend; /**阅读或者播放数量*/ private int browseNumber; /**评论数*/ private int commentbrowseNumber; /**赞数*/ private int praiseNumber; /**踩数*/ private int treadNumber; /**发布时间*/ private String issueTime; /**是否收藏*/ private int isCollect; /**关联视频*/ private List<VideoRelation> Content; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getDetails() { return details; } public void setDetails(String details) { this.details = details; } public String getChannelType() { return channelType; } public void setChannelType(String channelType) { this.channelType = channelType; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getIsRecommend() { return isRecommend; } public void setIsRecommend(String isRecommend) { this.isRecommend = isRecommend; } public int getBrowseNumber() { return browseNumber; } public void setBrowseNumber(int browseNumber) { this.browseNumber = browseNumber; } public int getCommentbrowseNumber() { return commentbrowseNumber; } public void setCommentbrowseNumber(int commentbrowseNumber) { this.commentbrowseNumber = commentbrowseNumber; } public int getPraiseNumber() { return praiseNumber; } public void setPraiseNumber(int praiseNumber) { this.praiseNumber = praiseNumber; } public int getTreadNumber() { return treadNumber; } public void setTreadNumber(int treadNumber) { this.treadNumber = treadNumber; } public String getIssueTime() { return issueTime; } public void setIssueTime(String issueTime) { this.issueTime = issueTime; } public String getChannelName() { return channelName; } public void setChannelName(String channelName) { this.channelName = channelName; } public int getIsCollect() { return isCollect; } public void setIsCollect(int isCollect) { this.isCollect = isCollect; } public List<VideoRelation> getContent() { return Content; } public void setContent(List<VideoRelation> content) { Content = content; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } }
第二个实体contentVo,具体代码如下所示:
package com.jczb.car.bean; import java.util.List; /** *说明: 内容集合,用于Json串的解析 *作者:丁国华 *时间:2015年9月10日 10:38:38 */ @SuppressWarnings("serial") public class ContentVo extends Entity { /** 服务器返回结果:true或false */ private String result; /** 服务器返回的Json串解析为List结合 */ private List<Content> Content; public String getResult() { return result; } public void setResult(String result) { this.result = result; } public List<Content> getContent() { return Content; } public void setContent(List<Content> content) { Content = content; } }
接着,来编写我们的需要调用的接口方法,代码如下所示:
/** * 说明:发现 * @user 丁国华 * @date 2015-8-31 下午2:10:59 */ public ContentVo discover(boolean isFirst, int contentVoId) throws AppException { ContentVo contentVo = null; // 构建缓存文件的key String key = "contentVo_" + contentVoId; // 1.如果联网则首先从服务器获取数据 if (isNetworkConnected() &&(isReadDataCache(key) || isFirst)) { try { // 从服务器获取Content的集合 contentVo = ApiClient.discover(this); // 如果能够获取到服务器中的数据则保存到本地缓存,只有保证数据不为空,且获取到的结果为true的时候才缓存到本地 if (contentVo != null && contentVo.getResult().equals("false")) { contentVo.setCacheKey(key); saveObject(contentVo, key); } } catch (AppException e) { // 如果出现访问中途断网,则获取本地缓存中的数据 contentVo = (ContentVo) readObject(key); // 如果本地缓存中数据为空,则抛出异常 if (contentVo == null) { throw e; } } } // 2.如果未联网则从缓存中获取数据 else { contentVo = (ContentVo) readObject(key); if (contentVo == null) { contentVo = new ContentVo(); } return contentVo; } return contentVo; }
第三步,我们来编写我们的xml布局,具体代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F7F7F7" android:orientation="vertical" > <LinearLayout style="@style/top_title_style" > <!-- 尖括号的布局 --> <ImageButton android:id="@+id/about_us_back" android:layout_width="14dp" android:layout_height="25.5dp" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:background="@drawable/back" /> <!-- 车段子布局 --> <TextView style="@style/top_title_word_style" android:text="车段子" /> </LinearLayout> <!-- 搜索 --> <RelativeLayout android:id="@+id/rl_search_id" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:orientation="horizontal" > <TextView android:id="@+id/et_seachkey_id" android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/search_photo" android:textSize="15sp" /> <ImageView android:id="@+id/iv_search_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="290dp" android:layout_marginTop="15dp" android:background="@drawable/search" /> <TextView android:id="@+id/iv_search_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_marginTop="15dp" android:textSize="15sp" android:hint="请输入搜索关键字" /> </RelativeLayout> <!-- 热门儿 --> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="5dp" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:text="@string/hot_channels_str" android:textColor="@color/light_blue" android:textSize="25sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="2dp" android:background="@color/lightgray" /> </LinearLayout> <!-- 热门儿内容 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?android:attr/listPreferredItemHeight" android:orientation="vertical" > <ListView android:id="@+id/lv_hotchannel_id" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null" android:minHeight="200dp" > </ListView> </LinearLayout> </LinearLayout>
第四步,编写java类里面所需要的代码,如下所示:
package com.jczb.car.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import com.jczb.car.AppContext; import com.jczb.car.AppException; import com.jczb.car.R; import com.jczb.car.bean.Content; import com.jczb.car.bean.ContentVo; /** * 说明:发现功能页面 * 作者:丁国华 * 时间: 2015-9-2下午2:02:58 */ public class DiscoveryActivity extends Activity implements OnClickListener, OnItemClickListener { //RelativeLayout rlFoundSearch; //ImageView ivTuBiaoSearch; // 声明用到的几个控件 private TextView etSearch; private ImageView ivSearch; private ListView lvHotChannel; private RelativeLayout rlFoundSearchEmpty; //private ImageView ivTuBiao; /**解析发现接口用的实体类*/ private ContentVo contentVo = null; /**用来填充ListView的List*/ private List<Map<String, Object>> data = new ArrayList<Map<String,Object>>(); /**用来获得服务器接口的发现内容集合*/ private List<Content> discoverContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.discovery); findViewById(); // 初始化页面控件 initView(); /*跳转到搜索关键字的空白的页面*/ rlFoundSearchEmpty.setOnClickListener(this); //ivTuBiao.setOnClickListener(this); // 启动子线程,获取服务器数据 discoverThread.start(); } private void findViewById() { // TODO Auto-generated method stub rlFoundSearchEmpty=(RelativeLayout) findViewById(R.id.rl_search_id); //ivTuBiao=(ImageView) findViewById(R.id.iv_search_tubiao_id); } @Override public void onClick(View v) { switch (v.getId()) { /*case R.id.iv_search_tubiao_id: break;*/ case R.id.rl_search_id: Intent intentFoundSerch = new Intent(this,SearchResourceActivity.class); startActivity(intentFoundSerch); break; default: break; } } /** *说明:初始化控件和监听事件 *作者:丁国华 * 时间:2015-9-2 下午2:12:49 */ public void initView() { // 初始化控件 etSearch = (TextView) findViewById(R.id.et_seachkey_id); ivSearch = (ImageView) findViewById(R.id.iv_search_id); lvHotChannel = (ListView) findViewById(R.id.lv_hotchannel_id); //rlFoundSearch=(RelativeLayout)findViewById(R.id.rl_search_id); // 初始化监听事件 ivSearch.setOnClickListener(this); // ListView想要实现点击事件本Activity必须实现OnItemClickListener接口 lvHotChannel.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { //点击item之后能够根据点击位置获取将要携带的参数跳转到搜索结果页 Intent intent = new Intent(DiscoveryActivity.this, VedioInfoActivity.class); intent.putExtra("channelType", discoverContent.get(position).getChannelType()); intent.putExtra("Id", discoverContent.get(position).getId()); startActivity(intent); } }); }; /** * 说明:从服务器端获取并加载数据到ListView中 * 作者: 丁国华 * 时间: 2015-9-2 下午2:54:27 */ public void loadData() { } /** * 定义一个线程等待 */ Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 需要根据线程中传递的msg中what的返回值进行判断 // 消息的what值为1,为空what为-1,异常为0 switch (msg.what) { case 1: //获取线程得到的服务器数据 contentVo = (ContentVo)msg.obj; discoverContent = contentVo.getContent(); //将数据赋给List<Map<>>集合 for (int i = 0; i< discoverContent.size(); i++) { Map<String, Object> map = new HashMap<String, Object>(); //map.put("Id", discoverContent.get(i).getId()); //map.put("channelType", discoverContent.get(i).getChannelType()); map.put("title", discoverContent.get(i).getTitle()); map.put("channelName", discoverContent.get(i).getChannelName()); data.add(map); } //定义填充ListView的Adapter并填充到ListView中 //String[]{}与map中填的名字必须保持一致 SimpleAdapter contentAdapter = new SimpleAdapter(DiscoveryActivity.this, data, R.layout.discovery_item,new String[]{"title","channelName"}, new int[]{R.id.tv_channelTopNews_id,R.id.tv_channelName_id}); lvHotChannel.setAdapter(contentAdapter); break; case -1: Toast.makeText(DiscoveryActivity.this, "数据为空!", Toast.LENGTH_LONG) .show(); break; case 0: Toast.makeText(DiscoveryActivity.this, "数据获取失败!", Toast.LENGTH_LONG) .show(); break; default: break; } } }; /** * 开启一个发现子线程 */ Thread discoverThread = new Thread(new Runnable() { @Override public void run() { Message msg = new Message(); // 获取全局对象Application AppContext appContext = (AppContext) getApplication(); try { // 获取服务器数据 contentVo = appContext.discover(true, 1); // 返回contentVo则将消息的what值为1,为空what为-1,异常为0 if (contentVo != null) { msg.what = 1; msg.obj = contentVo; } else { msg.what = -1; } } catch (AppException e) { msg.what = 0; e.printStackTrace(); } handler.sendMessage(msg); } }); /** * 说明:根据handler传过来的类型显示不同的Toast提示 * 作者:丁国华 * 时间:2015-9-2 下午3:53:30 */ public void showToast(int what) { switch (what) { case -1: Toast.makeText(DiscoveryActivity.this, "数据为空!", Toast.LENGTH_LONG) .show(); break; case 0: Toast.makeText(DiscoveryActivity.this, "数据获取失败!", Toast.LENGTH_LONG) .show(); default: break; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } }
到此,我们的发现这个功能的一条线就走下来了,最后,我们来看一下我们的运行效果,如下所示:
小编寄语:发现的实现功能,小编就简单的介绍到这里,发现实现了,但是小编到现在还是云里雾里,不过没关系,小编会越挫越勇的,这就是生命的意义,还是那句话对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下最珍贵的记忆,虽然以后小编不一定从事安卓这个行业,代码世界里,很多种事,有的甜蜜,有的温馨,有的婉转成歌,有的绵延不息,在这些故事里,我们唯一的共通之处就是,某年,某月,某个波澜不惊的日子里,曾经很爱很爱你!爱你--这段实习的日子里,安卓带给小编的种种的惊喜。在 下篇博文中小将和小伙伴们一起来分享,如何输入关键字,搜索出相应内容,敬请期待`(*∩_∩*)′!
发现----Android Demo的更多相关文章
- LeadTools Android 入门教学——运行第一个Android Demo
LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一 ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- 重大发现Android studio 如何简单快速修改package name
好多人都发现Android studio修改包名比较麻烦,只能一级一级的修改,今天偶尔发现了一个快捷方法. 废话不多说: 1 打开项目的AndroidManifest.xml文件 2 鼠标光笔定位到你 ...
- 制作Android Demo GIF:程序演示效果GIF图录制
[转] 制作Android Demo GIF:程序演示效果GIF图录制 在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...
- Ubuntu TensorFlow 源码 Android Demo的编译运行
Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...
- YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。
实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...
- vs2017 android demo
vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...
- react-navigation 做导航栏,发现 Android 上的标题不居中
在做 React Native 应用的时候,我们常常使用 react-navigation 做导航栏,发现 Android 上的标题不居中,IOS 上没问题. 1 如果只有标题,那就在 headerT ...
- BNR Android Demo学习笔记(一)——CrimeIntent
开发环境:win7,Android Studio 1.2, 1.Model Crime,数据模型,每个Crime有一个UUID作为唯一标识. package tina.criminalintent; ...
随机推荐
- poj 1704 Georgia and Bob(阶梯博弈)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9363 Accepted: 3055 D ...
- 【吃炸弹的鸽子UVA10765-双联通模板】
·从前有一个鸽子Lence,它吃了一个炸弹,然后有人出了这道题. ·英文题,述大意: 给出一张连通无向图,求出:对于每个点,删去这个点(以及它相连的边以后)时,当前图中的连通块数量,这个 ...
- SpringBoot学习之自动依赖
在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...
- PostgreSQL 查看单表大小
1. 在数据库中查单个表 select pg_size_pretty(pg_relation_size('table_name')); 2. 查出并按大小排序 SELECT table_schema ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令
ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...
- 南京邮电大学java程序设计作业在线编程第五次作业
王利国的"Java语言程序设计第5次作业(2018)"详细 主页 我的作业列表 作业结果详细 总分:100 选择题得分:50 1. 以下哪一个工具是Java的编译器?( ) A. ...
- 关于bedtools merge 功能中sort 命令的解释
Bedtools 是一个很好的用来处理区间的工具,很多时候用这个底层语言编写的小工具比自己写的脚本运行快很多,但是这个工具中的某些功能对输入文件有一定的要求,比如说里面的一个merge函数,这是里面的 ...
- Linux shell查询ip归属地
起因 有的时候写脚本需要能够在脚本中获取到ip的归属地,比如分析登录日志列出攻击者的相关信息等. 可以使用whois来查询ip的详细信息,但是whois并不是每台机器预装的,而且我想看中文的结果,所以 ...
- 深度解读GoogleNet之Inception V1
GoogleNet设计的目的 GoogleNet设计的初衷是为了提高在网络里面的计算资源的利用率. Motivation 网络越大,意味着网络的参数较多,尤其当数据集很小的时候,网络更容易发生过拟合. ...
- NavigationView使用过程的问题解决
NavigationView是android support design库提供的侧滑面板控件,通常与support v4库里的DrawerLayout侧滑控件搭配使用.以下是使用过程中遇到的问题及解 ...