标签:
时间悄悄的走,转眼来实习已经三个月了,三个月的时间,小编慢慢的成长着,从刚开始的电商项目到现在的车段子项目,小编在走过一个又一个项目的同时,走过了一个又一个战胜自己的奇迹,每次遇到一个新的技术点,小编就开始捣鼓,捣鼓这回事,真的需要勇气,捣鼓捣鼓,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
}
}
到此,我们的发现这个功能的一条线就走下来了,最后,我们来看一下我们的运行效果,如下所示:
小编寄语:发现的实现功能,小编就简单的介绍到这里,发现实现了,但是小编到现在还是云里雾里,不过没关系,小编会越挫越勇的,这就是生命的意义,还是那句话对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下最珍贵的记忆,虽然以后小编不一定从事安卓这个行业,代码世界里,很多种事,有的甜蜜,有的温馨,有的婉转成歌,有的绵延不息,在这些故事里,我们唯一的共通之处就是,某年,某月,某个波澜不惊的日子里,曾经很爱很爱你!爱你--这段实习的日子里,安卓带给小编的种种的惊喜。在 下篇博文中小将和小伙伴们一起来分享,如何输入关键字,搜索出相应内容,敬请期待`(*∩_∩*)′!
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u010850027/article/details/48338509