文件夹页面


布局只有一个listview,可以继承listactivity,这样少写一个布局文件
tool:

  1. * @param index 箱子的索引值
  2. * @return
  3. * 对应的uri 或null
  4. */
  5. public static Uri getUriFromIndex(int index){
  6. switch (index) {
  7. case 0:
  8. return MyConstants.URI_INBOX;
  9. case 1:
  10. return MyConstants.URI_OUTBOX;
  11. case 2:
  12. return MyConstants.URI_DRAFT;
  13. case 3:
  14. return MyConstants.URI_SENT;
  15. }
  16. return null;
  17. }
FolderUI :可以用%来改变条目的颜色
  1. public class FolderUI extends ListActivity implements OnItemClickListener{
  2. private ListView listView;
  3. private String [] names={"收件箱","发件箱","草稿箱","已发送"};
  4. private int[] iconIds={R.drawable.a_f_inbox,R.drawable.a_f_outbox,R.drawable.a_f_draft,R.drawable.a_f_sent};
  5. private int [] counts=new int[4];
  6. public Context ctx;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. ctx = this;
  11. listView = getListView();
  12. adapter = new FolderListAdapter();
  13. listView.setAdapter(adapter);
  14. prepareData();
  15. listView.setOnItemClickListener(this);
  16. }
  17. private void prepareData() {
  18. MyQueryHandler myQueryHandler = new MyQueryHandler(getContentResolver());
  19. for (int i = 0; i <4; i++) {
  20. myQueryHandler.startQuery(i, null, Tools.getUriFromIndex(i), new String[]{" count(*) "}, null, null, null);
  21. }
  22. myQueryHandler.setOnCursorChangedListener(new MyQueryHandler.IOnCursorChangedListener() {
  23. @Override
  24. public void onCursorChanged(int token, Object cookie, Cursor cursor) {
  25. //移动至第一行
  26. cursor.moveToFirst();
  27. // 获得短信的个数
  28. int count = cursor.getInt(0); // 仅查询 短信的条数,仅返回一列
  29. // 以 token 为counts的下标,存短信个数
  30. counts[token] = count;
  31. //刷新listView
  32. adapter.notifyDataSetChanged();
  33. }
  34. });
  35. }
  36. private FolderListAdapter adapter;
  37. class FolderListAdapter extends BaseAdapter{
  38. @Override
  39. public int getCount() {
  40. return names.length;
  41. }
  42. @Override
  43. public Object getItem(int position) {
  44. return null;
  45. }
  46. @Override
  47. public long getItemId(int position) {
  48. return 0;
  49. }
  50. @Override
  51. public View getView(int position, View convertView, ViewGroup parent) {
  52. View view;
  53. if(convertView == null){
  54. view = View.inflate(ctx, R.layout.list_item_folder, null);
  55. }else{
  56. view = convertView;
  57. }
  58. ImageView icon = (ImageView) view.findViewById(R.id.iv_icon_folder);
  59. TextView name = (TextView) view.findViewById(R.id.tv_name_folder);
  60. TextView count = (TextView) view.findViewById(R.id.tv_count_folder);
  61. icon.setBackgroundResource(iconIds[position]);
  62. name.setText(names[position]);
  63. count.setText(""+counts[position]);
  64. // 改变item的背景
  65. if(position%2 == 0){
  66. view.setBackgroundColor(Color.WHITE);
  67. }else{
  68. view.setBackgroundColor(Color.GRAY);
  69. }
  70. return view;
  71. }
  72. }
  73. @Override
  74. /**
  75. * 响应listview 条目点击事件
  76. */
  77. public void onItemClick(AdapterView<?> parent, View view, int position,
  78. long id) {
  79. Intent intent = new Intent(this,FolderDetail.class);
  80. intent.putExtra("position", position);
  81. startActivity(intent);
  82. }
  83. }
文件夹详情页:listview的条目都带着上面的一条的,解决方法
  1. 每个条目判断和上一个条目是否是同一天,不是显示,是隐藏,但是会不停的判读
  2. 在获取日期信息的时候保存到集合,不是同一天就保存,用第二种,缺点一次性全部取出效率不高

  1. public class FolderDetail extends Activity implements OnClickListener{
  2. private ListView listView;
  3. /**
  4. * 在文件夹页面,点击listView的位置
  5. */
  6. private int position;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. position = getIntent().getIntExtra("position", 0);
  11. setContentView(R.layout.activity_folder_detail);
  12. findViewById(R.id.btn_send).setOnClickListener(this);
  13. listView = (ListView) findViewById(R.id.lv_folder_detail);
  14. adapter = new FolderDetailListAdapter(this, null);
  15. listView.setAdapter(adapter);
  16. showPositionSet = new HashSet<Integer>();
  17. prepareData();
  18. }
  19. /**
  20. * 要查询的列
  21. */
  22. private String[] projection={
  23. "body","_id","address","date"
  24. };
  25. /**
  26. * 短信内容所在列的索引值 为 0
  27. */
  28. private final int INDEX_BODY = 0;
  29. /**
  30. * 短信联系人电话所在列的索引值 为 3
  31. */
  32. private final int INDEX_ADDRESS = 2;
  33. /**
  34. * 短信日期所在列的索引值 为 4
  35. */
  36. private final int INDEX_DATE = 3;
  37. private void prepareData() {
  38. MyQueryHandler myQueryHandler =new MyQueryHandler(getContentResolver());
  39. myQueryHandler.startQuery(99, adapter, Tools.getUriFromIndex(position),
  40. projection, null, null, " date desc");
  41. myQueryHandler.setOnCursorChangedListener(new MyQueryHandler.IOnCursorChangedListener() {
  42. @Override
  43. public void onCursorChanged(int token, Object cookie, Cursor cursor) {
  44. //遍历curosr 将需要显示标题的条目的位置,保存在 showPositionSet
  45. cursor.moveToPosition(-1);// 将cursor 移动到-1 的位置,方便遍历cursor
  46. showPositionSet.clear(); // 清空集合
  47. long lastDay=0;
  48. long thisDay=0;
  49. while(cursor.moveToNext()){
  50. thisDay=cursor.getLong(INDEX_DATE);
  51. if(!isSameToday(lastDay, thisDay)){ // 如果二个时间表示的不是同一天
  52. // 将当前cursor 的行数,保存至集合
  53. showPositionSet.add(cursor.getPosition());
  54. }
  55. lastDay = thisDay;
  56. }
  57. // 刷新listView
  58. adapter.notifyDataSetChanged();
  59. }
  60. });
  61. }
  62. /**
  63. * @return true 如果 二人长型数字,表示的是同一天
  64. */
  65. public boolean isSameToday(long lastDay,long thisDay) {
  66. Time time = new Time();
  67. time.set(lastDay);
  68. int thenYear = time.year;
  69. int thenMonth = time.month;
  70. int thenMonthDay = time.monthDay;
  71. time.set(thisDay);
  72. return (thenYear == time.year)
  73. && (thenMonth == time.month)
  74. && (thenMonthDay == time.monthDay);
  75. }
  76. /**
  77. * 应该显示标题的位置的集合
  78. */
  79. private HashSet<Integer> showPositionSet;
  80. private FolderDetailListAdapter adapter ;
  81. class FolderDetailListAdapter extends CursorAdapter{
  82. public FolderDetailListAdapter(Context context, Cursor c) {
  83. super(context, c);
  84. }
  85. @Override
  86. public View newView(Context context, Cursor cursor, ViewGroup parent) {
  87. View view = View.inflate(context, R.layout.list_item_folder_detail, null);
  88. FolderDetailViewHolder vh = new FolderDetailViewHolder();
  89. vh.title = (TextView) view.findViewById(R.id.tv_title_list_item);
  90. vh.face = (ImageView) view.findViewById(R.id.iv_face_list_item);
  91. vh.address = (TextView) view.findViewById(R.id.tv_address_list_item);
  92. vh.body = (TextView) view.findViewById(R.id.tv_body_list_item);
  93. vh.date = (TextView) view.findViewById(R.id.tv_date_list_item);
  94. view.setTag(vh);
  95. return view;
  96. }
  97. @Override
  98. public void bindView(View view, Context context, Cursor cursor) {
  99. FolderDetailViewHolder vh = (FolderDetailViewHolder) view.getTag();
  100. //TODO
  101. //设置短信内容
  102. vh.body.setText(cursor.getString(INDEX_BODY));
  103. //设置时间
  104. long when = cursor.getLong(INDEX_DATE);
  105. String dateStr;
  106. if(DateUtils.isToday(when)){
  107. dateStr = DateFormat.getTimeFormat(context).format(when);
  108. }else{
  109. dateStr = DateFormat.getDateFormat(context).format(when);
  110. }
  111. vh.date.setText(dateStr);
  112. //设置联系人的名
  113. String number = cursor.getString(INDEX_ADDRESS);
  114. String name = Tools.findNameByNumber(context, number);
  115. if(name == null){//无此联系人
  116. vh.address.setText(number);
  117. }else{
  118. vh.address.setText(name);
  119. }
  120. // 设置头像
  121. int contactId = Tools.findIDByNumber(context, number);
  122. if(contactId == -1){ // 无此联系人
  123. vh.face.setBackgroundResource(R.drawable.ic_unknow_contact_picture);
  124. }else{
  125. Bitmap bitmap = Tools.getFaceById(context, ""+contactId);
  126. if(bitmap ==null){//联系人,无头像
  127. vh.face.setBackgroundResource(R.drawable.ic_contact_picture);
  128. }else{
  129. vh.face.setBackgroundDrawable(new BitmapDrawable(bitmap));
  130. }
  131. }
  132. // 设置标题
  133. if(showPositionSet.contains(cursor.getPosition())){ // 如果集合中包含此行,那么,就显示标题 ,
  134. vh.title.setText(DateFormat.getDateFormat(context).format(when));
  135. vh.title.setVisibility(View.VISIBLE);
  136. }else{
  137. // 否则,就隐藏标题
  138. vh.title.setVisibility(View.GONE);
  139. }
  140. }
  141. }
  142. class FolderDetailViewHolder{
  143. public TextView title;
  144. public ImageView face;
  145. public TextView address;
  146. public TextView body;
  147. public TextView date;
  148. }
  149. @Override
  150. /**
  151. * 响应新建信息的点击事件
  152. */
  153. public void onClick(View v) {
  154. Intent intent = new Intent(this,NewMessageUI.class);
  155. startActivity(intent);
  156. }
  157. }

6.listview显示不用条目的更多相关文章

  1. ListView显示Sqlite的数据美化版与性能优化

    在上一篇文章中,我们已经实现在listview显示数据库内容的.但是我们listview中,排版不是很好看,所以这篇文章呢,我们来对listveiw进行美化.哈哈,说白了,就是对listview添加一 ...

  2. ListView---复杂的listview显示

    1 . 初始化数据 private void fillData() { ll_loading.setVisibility(View.VISIBLE); // 显示进度 new Thread() { p ...

  3. 转 wince程序 中使用Listview显示图标问题 (C#) .

    思路: 1.窗体控件:lstaqgl [Listview控件名称]  imageList1[ImageList控件] 2.  图片路径添加到—imageList1——Listview显示图片从 ima ...

  4. listview 点击条目 自动置顶或者自动置底部

    关于Listview点击条目,自动滑动到点击条目实现: map_searchresult_list.post(new Runnable() { @Override public void run() ...

  5. Android在ListView显示图片(重复混乱闪烁问题)

    Android在ListView显示图片(重复混乱闪烁问题) 1.原因分析 ListView item缓存机制: 为了使得性能更优,ListView会缓存行item(某行相应的View). ListV ...

  6. ScrollView嵌套ListView显示不完全、嵌套TextView不能滚动解决办法

    目录: 一.情景说明 二.最初做法 三.解决办法 一.情景说明 1.情景       最近项目刚好有一个需求,需要在一个界面中用ScrollView嵌套一个滚动的TextView和一个listView ...

  7. android listView多层嵌套listView显示不全问题

    最近在做项目,需要用到listVIew多层嵌套listVIew的需求,先发现已下两个处理办法比较好用 第一种: public class ListViewNesting extends ListVie ...

  8. 解决ScrollView中包含ListView,导致ListView显示不全

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...

  9. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

随机推荐

  1. crm开发之用户ModelForm定制和密码加密

    写了这么多的定制 功能.终于可以定制一下了!因为是 stark 和 rbac 两个组建. 一起使用. 所以在这里,再记录一下.需要注意的点: 先放出 目录结构: 先从  stark 开始.使用star ...

  2. Tigase-02 tigase-server7.1.0使用git 克隆下来,并在eclipse 上运行调试

    继 Tigase-01 使用spark或spi登录Tigase服务器,这节说明下使用 eclipse git克隆 tigase-server7.1.0,并运行调试!最近有不少同学尝试去git clon ...

  3. LaTeX入门

    原写于我的洛谷博客,由于洛谷的\(\mathtt{markdown}\)编辑器和博客园的\(\mathtt{markdown}\)编辑器有点差别,所以实在懒得进行微调,就直接挂一个到洛谷博客的链接好了 ...

  4. Maven 属性

    maven 中使用 ${属性名} 来访问属性 内置属性 (maven 预定义,用户可以直接使用的属性) ${basedir}  表示项目根目录,即包含 pom.xml 文件的目录.同 ${projec ...

  5. 摹客iDoc 新功能“柔性工作流”,让设计随需而动

    摹客iDoc推出了全新“柔性工作流”,让协作设计自由流动,随需而动. 更高效.更自由的协作方式,赶快告诉你的团队吧~ “柔性工作流” VS “普通工作流” 普通工作流往往是将很多东西混杂在一起,并施以 ...

  6. kvm 客户机加载移动硬盘

    1,宿主机安装usbutils yum install usbutils -y 2,插入U盘或者移动硬盘并查看 [root@localhost ~]# lsusb Bus Device : ID 10 ...

  7. Anaconda的安装及使用

    总结的很清楚,做个记录. http://python.jobbole.com/86236/

  8. Atom使用

    cmd-r 通过方法名查找 ctrl-option-g 跳转至光标所在方法或结构 安装 last-cursor-position 后 alt-- 返回至光标上一次所在位置

  9. iOS 关于重定向的那些事(NSURLProcotol-WKWebView)

    重定向定义:重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向.域名的重定向.路由选择的变化也是对数据报文经由路径的一种重定向).   NSURLProt ...

  10. IE 11和const的兼容问题

    说好的IE11兼容javascript中的常量类型 const 呢 ?可能并没有完全兼容 项目中遇到一个问题,采用google浏览器访问没问题,在本地jetty启动,IE11也可以正常访问,然而当我将 ...