时间悄悄的走,转眼来实习已经三个月了,三个月的时间,小编慢慢的成长着,从刚开始的电商项目到现在的车段子项目,小编在走过一个又一个项目的同时,走过了一个又一个战胜自己的奇迹,每次遇到一个新的技术点,小编就开始捣鼓,捣鼓这回事,真的需要勇气,捣鼓捣鼓,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. CSS3中三种清除浮动(float)的方法

    方法一:添加新的元素 .应用 clear:both .clear{ clear:both; height:; height:; overflow:hidden; } 方法二:父级div定义 overf ...

  2. Express 配置 https / 443 安全链接

    按照教程已配置成功 前一部分内容参照     https://blog.csdn.net/chenyufeng1991/article/details/60340006 前半部分是生成证书文件,关键部 ...

  3. eclipse创建web项目修改路径

  4. 628. Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  5. Unity使用C++作为游戏逻辑脚本的研究

    文章申明:本文来自JacksonDunstan的博客系列文章内容摘取和翻译,版权归其所有,附上原文的链接,大家可以有空阅读原文:C++ Scripting( in Unity) 一.C#和C++的通信 ...

  6. bootstrap table 和 x-editable 使用方法

    最近需要做一些数据表格,有同事推荐EasyUI,但经过比较还是选择了Bootstrap,一款极为强大的表格组件,基于Bootstrap 的 jQuery .本文还将介绍Bootstrap-editab ...

  7. 在OpenCV3.1.0中使用SIFT,SURF算法

    写在前边: 1.我使用的是python2.7 + OpenCV3.1.0 2.OpenCV3.0.0+的文档有很大问题,很多文档写的还是OpenCV2.0+, OpenCV3.0+根本用不了,其中有一 ...

  8. exp和imp的工作原理

    --1.exp和imp的输入都是名字和值对: 如:exp parameter_name=value 或exp parameter_name=(value1,value2,value3..) --2.e ...

  9. 干货!一次kafka卡顿事故排查过程

    由于一次功能上线后,导致某数据量急剧下滑,给我们紧张的呢!排查过程也是个学习过程(这其中有大部分是领导们的功劳,不过分享给大家应该也不犯法吧,ᐓ) 1. 确认问题的真实性? 被数据部门告知,某数据量下 ...

  10. Dynamics CRM 查找字段下拉的最多10个选项的排序规则

    原文链接来自DTCCh论坛http://dynamics.ms-talent.com.cn/bbs/content/?id=1406&catogory=CRM 如果你是从事dynamics c ...