时间悄悄的走,转眼来实习已经三个月了,三个月的时间,小编慢慢的成长着,从刚开始的电商项目到现在的车段子项目,小编在走过一个又一个项目的同时,走过了一个又一个战胜自己的奇迹,每次遇到一个新的技术点,小编就开始捣鼓,捣鼓这回事,真的需要勇气,捣鼓捣鼓,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的更多相关文章

  1. LeadTools Android 入门教学——运行第一个Android Demo

    LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一 ...

  2. 【Android】如何快速构建Android Demo

    [Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...

  3. 重大发现Android studio 如何简单快速修改package name

    好多人都发现Android studio修改包名比较麻烦,只能一级一级的修改,今天偶尔发现了一个快捷方法. 废话不多说: 1 打开项目的AndroidManifest.xml文件 2 鼠标光笔定位到你 ...

  4. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  5. Ubuntu TensorFlow 源码 Android Demo的编译运行

    Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...

  6. YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。

    实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...

  7. vs2017 android demo

    vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...

  8. react-navigation 做导航栏,发现 Android 上的标题不居中

    在做 React Native 应用的时候,我们常常使用 react-navigation 做导航栏,发现 Android 上的标题不居中,IOS 上没问题. 1 如果只有标题,那就在 headerT ...

  9. BNR Android Demo学习笔记(一)——CrimeIntent

    开发环境:win7,Android Studio 1.2, 1.Model Crime,数据模型,每个Crime有一个UUID作为唯一标识. package tina.criminalintent; ...

随机推荐

  1. 【USACO Mar08】 奶牛跑步 A-star k短路

    Description Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘,然后走回牛棚. Bessie也不想跑得太远,所以她想走最短的路经. 农场上一共有M( ...

  2. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. seq2seq-chatbot:200 行代码实现聊天机器人

    Chatbot in 200 lines of code CPU 跑不动 github:https://github.com/zsdonghao/seq2seq-chatbot 更多英文,中文聊天机器 ...

  4. [坑]Spring利用注解@Value获取properties属性为null

    今天在项目中想使用@Value来获取Springboot中properties中属性值. 场景:定义了一个工具类,想要获取一些配置参数,使用了@value来获取,但是死活也获取不到. 如何解决:在使用 ...

  5. 背景重复样式background-repeat

    一.background-repeat属性 在CSS中,使用background-repeat属性可以设置背景图像是否平铺,并且可以设置如何平铺. 语法: background-repeat:取值; ...

  6. 07_Linux目录文件操作命令4解压缩,文件查找_我的Linux之路

    这一节还是一样学习操作目录文件的命令 在这一节,我会讲到解压压缩tar以及zip命令,以及文本查找命令grep tar 打包压缩命令 tar命令可以为linux的文件和目录创建档案 首先要弄清两个概念 ...

  7. Web网页树形列表中实现选中父节点则子节点全选和不选中父则子全不选

                需要实现的功能:选中父节点对应子节点全选:不选中父节点,对应子节点也不选中 如下图所示,选中车队,对应车队中车辆也全部选中,以实现车队中所有车辆在地图上的显示. 选中cqupt ...

  8. vmware迁移到openstack的一些坑

    title: 安全平台迁移 tags: 新建,模板,小书匠 grammar_cjkRuby: true --- 前言 主要有三个坑: 一是如果原先虚拟机没有安装virtio驱动,要设置设备驱动为ide ...

  9. hive 存储,解析,处理json数据

    hive 处理json数据总体来说有两个方向的路走 1.将json以字符串的方式整个入Hive表,然后通过使用UDF函数解析已经导入到hive中的数据,比如使用LATERAL VIEW json_tu ...

  10. vue以及js的一些坑或常用技巧

    判断空object Object.getOwnPropertyNames(obj).length === 0 模拟range Array.apply(null, Array(5)).map(funct ...