今天我们来讲述一下如何使用ListView来模仿微博随便看看栏目(ps:这是老师布置的作业,所以…),在前篇博客中,我们讲述了细解ListView之自定义适配器的使用,所以本篇我们不以特别详细的讲述(ps:细解ListView之自定义适配器:http://www.cnblogs.com/boy1025/p/4438999.html),本程序的链接附在文章的正下方,欢迎下载【版权所有,转载请注明出处,谢谢】

下面我们进入正题,首先我们来看下效果图:

--------------------------------------------------------------------------------------------------------------------------

【分析】

要完成这个小功能,我们需要:

1.ListView及ListView_Item

2.实体类的编写

3.自定义适配器的书写

4.ListView的绑定数据源与控件

----->>在上述分析中,最重要的是自定义适配器的书写,此功能我们继承是BaseAdapter

【编码】

1.首先我们来看自定义适配器MyAdapter:

  1. package cn.edu.bzu.adapter;
  2.  
  3. import java.util.List;
  4.  
  5. import cn.edu.bzu.entity.Information;
  6. import cn.edu.bzu.weibo_looking.R;
  7. import android.content.Context;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.widget.BaseAdapter;
  12. import android.widget.ImageView;
  13. import android.widget.TextView;
  14.  
  15. /**
  16. * 自定义Adapter实现listView的显示
  17. * @author monster
  18. * @date : 2015-04-28
  19. */
  20. public class MyAdapter extends BaseAdapter {
  21. private List<Information> list;
  22. private Context mContext;
  23. private LayoutInflater mInflater;
  24. //定义构造方法
  25. public MyAdapter(List<Information> list, Context mContext) {
  26. super();
  27. this.list = list;
  28. this.mContext = mContext;
  29. }
  30.  
  31. @Override
  32. public int getCount() {
  33. return list.size();
  34. }
  35.  
  36. @Override
  37. public Object getItem(int position) {
  38. return list.get(position);
  39. }
  40.  
  41. @Override
  42. public long getItemId(int position) {
  43. return position;
  44. }
  45.  
  46. @Override
  47. public View getView(int position, View convertView, ViewGroup parent) {
  48. ViewHolder holder=null;
  49. if(convertView==null){
  50. convertView=mInflater.from(mContext).inflate(R.layout.listview_item,null); //布局转换成视图
  51. holder=new ViewHolder();
  52. //实例化控件
  53. holder.Image=(ImageView)convertView.findViewById(R.id.Iv);
  54. holder.Name=(TextView)convertView.findViewById(R.id.Name);
  55. holder.Time=(TextView)convertView.findViewById(R.id.Time);
  56. holder.Contents=(TextView)convertView.findViewById(R.id.Contents);
  57. convertView.setTag(holder); //设置setTag使得程序得以优化
  58. }else{
  59. holder=(ViewHolder) convertView.getTag();
  60. }
  61. //给控件赋值
  62. holder.Image.setBackgroundResource(list.get(position).getImgId());
  63. holder.Name.setText(list.get(position).getName());
  64. holder.Time.setText(list.get(position).getDate());
  65. holder.Contents.setText(list.get(position).getContent());
  66. return convertView;
  67. }
  68.  
  69. class ViewHolder{
  70. ImageView Image;
  71. TextView Name;
  72. TextView Time;
  73. TextView Contents;
  74. }
  75. }

PS:在继承BaseAdapter 需要实现getCount,getItem,getItemId,getView,以及构造方法 等方法,里面最重要的是getView方法,本文用到ViewHolder设计模式,具体的ViewHolder设计模式的优点,请参考(http://www.cnblogs.com/boy1025/p/4438999.html

2.MainActivity的编写

  1. package cn.edu.bzu.weibo_looking;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import cn.edu.bzu.adapter.MyAdapter;
  7. import cn.edu.bzu.entity.Information;
  8. import android.os.Bundle;
  9. import android.widget.ListView;
  10. import android.app.Activity;
  11.  
  12. public class MainActivity extends Activity {
  13. private ListView listView;
  14. private MyAdapter adapter;
  15. private List<Information> list;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. setData();//数据源
  21. initView();
  22. }
  23. private void initView() {
  24. // 初始化控件
  25. listView=(ListView) findViewById(R.id.Lv);
  26. listView.setAdapter(adapter); //绑定适配器
  27. }
  28. private void setData() {
  29. // 设置数据源
  30. list=new ArrayList<Information>();
  31. list.add(new Information(R.drawable.img1,"monsterLin","2015-04-28","Do whatever you want"));
  32. list.add(new Information(R.drawable.img2, "HuZi", "2015-04-28", "老板给我涨工资了,好开森"));
  33. list.add(new Information(R.drawable.img3,"YY","2015-04-28","他变了,他真的变了,他真的真的变帅了"));
  34. list.add(new Information(R.drawable.img4,"XiaoY","2015-04-28","Lalala德玛西亚"));
  35. list.add(new Information(R.drawable.img5,"BigWhite","2015-04-28","妹子,你好,我是雷锋"));
  36. list.add(new Information(R.drawable.img6, "DongDong", "2015-04-28", "脱单了,我好开心啊,啦啦啦"));
  37. list.add(new Information(R.drawable.img7, "XiaoXin", "2015-04-28", "今天和闺蜜去超市,买了好多好多好吃的##"));
  38. list.add(new Information(R.drawable.img8, "Robi", "2015-04-28", "这个Vpn,我推荐Xroute,天然无公害~"));
  39. adapter=new MyAdapter(list, MainActivity.this);
  40. }
  41. }

Ps:在书写MainActivity的时候:

1.建立数据源

2.实例化控件

3.绑定适配器

------------------------------------------------------------------------------------------------------------------------

【优化篇】

优化思路:由于每次书写自定义适配器的时候总是会书写构造方法,getCount(),getItem(),getItemId,getView()方法,以及ViewHolder方法 所以我们对其进行优化,优化是书写CommonAdapter,ViewHolder这两个工具类,在书写适配器的时候继承CommonAdapter即可

---->>代码部分:

CommonAdapter.java:

  1. package cn.edu.bzu.util;
  2.  
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.TextView;
  9.  
  10. import java.util.List;
  11.  
  12. import cn.edu.bzu.weibo_looking.R;
  13.  
  14. /**
  15. * CommonAdapter makes Common extends BaseAdapter
  16. * Created by monster on 2015/5/3.
  17. */
  18. public abstract class CommonAdapter<T> extends BaseAdapter {
  19. protected Context mContext;
  20. protected List<T> mDatas;
  21. protected LayoutInflater mInflater;
  22.  
  23. public CommonAdapter(Context context,List<T>datas){
  24. this.mContext=context;
  25. this.mDatas=datas;
  26. mInflater=LayoutInflater.from(context);
  27. }
  28. @Override
  29. public int getCount() {
  30. return mDatas.size();
  31. }
  32.  
  33. @Override
  34. public T getItem(int position) {
  35. return mDatas.get(position);
  36. }
  37.  
  38. @Override
  39. public long getItemId(int position) {
  40. return position;
  41. }
  42.  
  43. @Override
  44. public View getView(int position, View convertView, ViewGroup parent){
  45. ViewHolder holder=ViewHolder.get(mContext,convertView,parent, R.layout.listview_item,position);
  46. convert(holder,getItem(position));
  47. return holder.getConvertView();
  48. }
  49. public abstract void convert(ViewHolder holder,T t);
  50.  
  51. }

ViewHolder.java:

  1. package cn.edu.bzu.util;
  2.  
  3. import android.content.Context;
  4. import android.util.SparseArray;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10.  
  11. /**
  12. * Created by monster on 2015/4/20.
  13. * Have a good package ViewHolder
  14. * get(Context context,View convertView,ViewGroup parent,int layoutId,int position) To make ViewHolder
  15. *
  16. */
  17. public class ViewHolder {
  18. private SparseArray<View> mViews; //稀疏数组,SparseArray比HashMap执行效率高
  19. private int mPosition;
  20. private View mConvertView; //作用是方便系统在重写UI时,能重用原来实用过的View实例,以此来降低系统资源的消耗和提高代码效率
  21. /*
  22. *ConvertView的几点特征。
  23. *对于一个ListView,Android保存所有曾经生成过的ConvertView实例,直至系统垃圾回收这些实例位置,而不是只保存最后使用的ConvertView对象。
  24. *这些保存的ConvertView以使用时间顺序排序,并依次被传递到getView函数中。
  25. */
  26. public ViewHolder(Context context,ViewGroup parent,int layoutId,int position){
  27. //ViewHolder的构造方法
  28. this.mPosition=position;
  29. this.mViews=new SparseArray<View>(); //初始化SparseArray对象
  30. mConvertView= LayoutInflater.from(context).inflate(layoutId,parent,false);
  31. mConvertView.setTag(this);
  32. }
  33.  
  34. public static ViewHolder get(Context context,View convertView,ViewGroup parent,int layoutId,int position){
  35. if(convertView==null){
  36. return new ViewHolder(context,parent,layoutId,position);
  37. }else{
  38. ViewHolder holder=(ViewHolder)convertView.getTag();
  39. holder.mPosition=position;
  40. return holder;
  41. }
  42. }
  43.  
  44. /**
  45. * 通过viewId获取控件
  46. * @param viewId
  47. * @param <T>
  48. * @return
  49. */
  50. public <T extends View> T getView(int viewId){
  51. View view=mViews.get(viewId);
  52. if(view==null){
  53. view=mConvertView.findViewById(viewId);
  54. mViews.put(viewId,view);
  55. }
  56. return (T)view;
  57. }
  58. public View getConvertView() {
  59. return mConvertView;
  60. }
  61.  
  62. /**
  63. * 为设置TextView的值
  64. * @param viewId
  65. * @param text
  66. * @return
  67. */
  68. public ViewHolder setText(int viewId,String text){
  69. TextView tv=getView(viewId);
  70. tv.setText(text);
  71. return this;
  72. }
  73.  
  74. /**
  75. * 设置图片
  76. * @param viewId
  77. * @param resId
  78. * @return
  79. */
  80. public ViewHolder setImageResource(int viewId,int resId){
  81. ImageView view=getView(viewId);
  82. view.setImageResource(resId);
  83. return this;
  84. }
  85. }

OptimizeAdapter.java

  1. package cn.edu.bzu.adapter;
  2.  
  3. import java.util.List;
  4.  
  5. import android.content.Context;
  6. import cn.edu.bzu.entity.Information;
  7. import cn.edu.bzu.util.CommonAdapter;
  8. import cn.edu.bzu.util.ViewHolder;
  9. import cn.edu.bzu.weibo_looking.R;
  10.  
  11. public class OptimizeAdapter extends CommonAdapter<Information> {
  12.  
  13. public OptimizeAdapter(Context context, List<Information> datas) {
  14. super(context, datas);
  15. }
  16.  
  17. @Override
  18. public void convert(ViewHolder holder, Information information) {
  19. //给控件赋值,通过getter/setter方法实现
  20. holder.setText(R.id.Name,information.getName());
  21. holder.setText(R.id.Time, information.getDate());
  22. holder.setText(R.id.Contents,information.getContent());
  23. holder.setImageResource(R.id.Iv, information.getImgId());
  24. }
  25.  
  26. }

--->优化总结:

   经过优化,我们在书写ListView的时候仅仅需要把这两个工具类导入到项目,自己仅仅需要书写适配器的构造方法以及convert()方法即可,这样优化了ListView的执行效率

------------------------------------------------------------------------------------------------------------------------

【附录】

源代码下载链接:https://github.com/monsterLin/WeiBo_Looking

ListView的使用-模拟微博随便看看栏目【执行与优化】的更多相关文章

  1. Python模拟微博登陆,亲测有效

    今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密.那么首先就要做那件必做之事!模拟登陆-- 代码是参考了:https://www.douban.com/note/201767245/ 我对代码 ...

  2. python爬虫-模拟微博登录

    微博模拟登录 这是本次爬取的网址:https://weibo.com/ 一.请求分析 找到登录的位置,填写用户名密码进行登录操作 看看这次请求响应的数据是什么 这是响应得到的数据,保存下来 exect ...

  3. 杨老师课堂_Java核心技术下之控制台模拟微博用户注册案例

    案例设计背景介绍: 编写一个新浪微博用户注册的程序,要求使用HashSet集合实现.  假设当用户输入用户名.密码.确认密码.生日(输入格式yyyy-mm-dd为正确).手机号码(手机长度为11位,并 ...

  4. Android Scrollview嵌套下listView动态加载数据,解决onScrollChanged执行多次数据重复问题

    这一篇博客和上一篇讲的都是listView的动态加载,但有所不同的是,本篇的listView是嵌套在ScrollView下的,有时候在一个Activity中可能分为好几个模块,由于展示的需要(手机屏幕 ...

  5. ListView不规律刷新多次,重复执行getView

    写ListView的时候,有时会发现ListView中的getView执行多次,有的时候又不是,搞了半天才找到原因,在http://blog.csdn.net/danielinbiti/article ...

  6. LISTVIEW嵌套GRIDVIEW的一些处理(点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置)(对这篇文章的优化处理,不每次都new onItemClickListener)

    前几天写了点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置,当时的处理是在ListView的适配器里的GetView方法里每次都new GridView的onItemClickList ...

  7. 接口测试执行工具Postman:模拟请求、用例执行、断言、批量运行用例、简单持续集成

    一.接口测试-postman-模拟HTTP Requests 二.接口测试-postman-权限Authorization 三.接口测试-postman-断言Writting Test 四.接口测试- ...

  8. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

  9. 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)

    [描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...

随机推荐

  1. .net混淆、反编译工具调查

    常用的工具列表[比较常见的] 混淆器.加密 Dotfuscator VS默认带的工具,不过是个社区版 强度不大 dotNET Reactor 使用了NativeCode 和混淆的形式 Xenocode ...

  2. Windows 8.1 新增控件之 AppBar

    Windows 8.1 与Windows 8 相比已经有了很多改进,从ITPro 角度这篇文章<What's New in Windows 8.1>已经表述的很详细.对开发者来说,最明显的 ...

  3. Kafka是分布式发布-订阅消息系统

    Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...

  4. gradient 线性渐变 浏览器兼容

    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=white, endColorstr= ...

  5. Spring 4.0.2 学习笔记(1) - 最基本的注入

    1. 添加maven支持 <dependency> <groupId>org.springframework</groupId> <artifactId> ...

  6. python数字图像处理(15):霍夫线变换

    在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中 ...

  7. 高性能JavaScript 循环语句和流程控制

    前言 上一篇探讨了达夫设备对于代码性能的影响,本文主要探讨并且测试各种常见的循环语句的性能以及流程控制中常见的优化. 循环语句 众所周知,常用的循环语句有for.while.do-while以及for ...

  8. 从源码角度看finish()方法的执行流程

    1. finish()方法概览 首先我们来看一下finish方法的无参版本的定义: /** * Call this when your activity is done and should be c ...

  9. 在VS2010 下编译 cocos2d-x-2.1.4

    首先感谢 cocos2d-x 团队为我们做出这么好的跨平台框架,让我们这些码农省了很多时间,事半功倍. 里沃特最近在编译 win32 版本的时候最到一点小问题,现在记录下,说不定能帮到某些初学的朋友. ...

  10. js单选和复选框

    http://blog.csdn.net/chelen_jak/article/details/44827393 http://www.gbtags.com/technology/jquerynews ...