专栏首页Android开发指南6.listview显示不用条目

6.listview显示不用条目

文件夹页面

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

tool:

 * @param index 箱子的索引值
 * @return
 * 对应的uri 或null 
 */
 public static Uri getUriFromIndex(int index){
 switch (index) {
 case 0:
 return MyConstants.URI_INBOX;
 case 1:
 return MyConstants.URI_OUTBOX;
 case 2:
 return MyConstants.URI_DRAFT;
 case 3:
 return MyConstants.URI_SENT;
 }
 return null;
 }

FolderUI :可以用%来改变条目的颜色

public class FolderUI extends ListActivity implements OnItemClickListener{
 private ListView listView;
 private String [] names={"收件箱","发件箱","草稿箱","已发送"};
 private int[] iconIds={R.drawable.a_f_inbox,R.drawable.a_f_outbox,R.drawable.a_f_draft,R.drawable.a_f_sent};
 private int [] counts=new int[4];
 public Context ctx;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
		ctx = this;
		listView = getListView();
		adapter = new FolderListAdapter();
		listView.setAdapter(adapter);
		prepareData();
		listView.setOnItemClickListener(this);
 }
 private void prepareData() {
 MyQueryHandler myQueryHandler = new MyQueryHandler(getContentResolver());
 for (int i = 0; i <4; i++) {
			myQueryHandler.startQuery(i, null, Tools.getUriFromIndex(i), new String[]{" count(*) "}, null, null, null);
 }
		myQueryHandler.setOnCursorChangedListener(new MyQueryHandler.IOnCursorChangedListener() {
 @Override
 public void onCursorChanged(int token, Object cookie, Cursor cursor) {
 //移动至第一行
				cursor.moveToFirst();
 // 获得短信的个数
 int count = cursor.getInt(0); // 仅查询 短信的条数,仅返回一列 
 // 以 token 为counts的下标,存短信个数
				counts[token] = count;
 //刷新listView 
				adapter.notifyDataSetChanged();
 }
 });
 }
 private FolderListAdapter adapter;
 class FolderListAdapter extends BaseAdapter{
 @Override
 public int getCount() {
 return names.length;
 }
 @Override
 public Object getItem(int position) {
 return null;
 }
 @Override
 public long getItemId(int position) {
 return 0;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 View  view;
 if(convertView == null){
				view = View.inflate(ctx, R.layout.list_item_folder, null);
 }else{
				view = convertView;
 }
 ImageView icon = (ImageView) view.findViewById(R.id.iv_icon_folder);
 TextView name = (TextView) view.findViewById(R.id.tv_name_folder);
 TextView count = (TextView) view.findViewById(R.id.tv_count_folder);
			icon.setBackgroundResource(iconIds[position]);
			name.setText(names[position]);
			count.setText(""+counts[position]);
 // 改变item的背景
 if(position%2 == 0){
				view.setBackgroundColor(Color.WHITE);
 }else{
				view.setBackgroundColor(Color.GRAY);
 }
 return view;
 }
 }
 @Override
 /**
	 * 响应listview 条目点击事件
	 */
 public void onItemClick(AdapterView<?> parent, View view, int position,
 long id) {
 Intent intent = new Intent(this,FolderDetail.class);
		intent.putExtra("position", position);
		startActivity(intent);
 }
}

文件夹详情页:listview的条目都带着上面的一条的,解决方法

  1. 每个条目判断和上一个条目是否是同一天,不是显示,是隐藏,但是会不停的判读
  2. 在获取日期信息的时候保存到集合,不是同一天就保存,用第二种,缺点一次性全部取出效率不高
public class FolderDetail extends Activity implements OnClickListener{
 private ListView listView;
 /**
	 * 在文件夹页面,点击listView的位置
	 */
 private int position;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
		position = getIntent().getIntExtra("position", 0);
		setContentView(R.layout.activity_folder_detail);
		findViewById(R.id.btn_send).setOnClickListener(this);
		listView  = (ListView) findViewById(R.id.lv_folder_detail);
		adapter = new FolderDetailListAdapter(this, null);
		listView.setAdapter(adapter);
		showPositionSet = new HashSet<Integer>();
		prepareData();
 }
 /**
	 * 要查询的列
	 */
 private String[] projection={
 "body","_id","address","date"
 };
 /**
	 * 短信内容所在列的索引值 为 0
	 */
 private final int INDEX_BODY = 0;
 /**
	 * 短信联系人电话所在列的索引值 为 3
	 */
 private final int INDEX_ADDRESS = 2;
 /**
	 * 短信日期所在列的索引值 为 4
	 */
 private final int INDEX_DATE = 3;
 private void prepareData() {
 MyQueryHandler myQueryHandler =new MyQueryHandler(getContentResolver());
		myQueryHandler.startQuery(99, adapter, Tools.getUriFromIndex(position),
				projection, null, null, " date desc");
		myQueryHandler.setOnCursorChangedListener(new MyQueryHandler.IOnCursorChangedListener() {
 @Override
 public void onCursorChanged(int token, Object cookie, Cursor cursor) {
 //遍历curosr 将需要显示标题的条目的位置,保存在 showPositionSet 
				cursor.moveToPosition(-1);// 将cursor 移动到-1 的位置,方便遍历cursor
				showPositionSet.clear(); // 清空集合
 long lastDay=0;
 long thisDay=0;
 while(cursor.moveToNext()){
					thisDay=cursor.getLong(INDEX_DATE);
 if(!isSameToday(lastDay, thisDay)){ // 如果二个时间表示的不是同一天
 // 将当前cursor 的行数,保存至集合
						showPositionSet.add(cursor.getPosition());
 }
					lastDay = thisDay;
 }
 // 刷新listView 
				adapter.notifyDataSetChanged();
 }
 });
 }
 /**
     * @return true 如果 二人长型数字,表示的是同一天
     */
 public boolean isSameToday(long lastDay,long thisDay) {
 Time time = new Time();
        time.set(lastDay);
 int thenYear = time.year;
 int thenMonth = time.month;
 int thenMonthDay = time.monthDay;
        time.set(thisDay);
 return (thenYear == time.year)
 && (thenMonth == time.month) 
 && (thenMonthDay == time.monthDay);
 }
 /**
	 * 应该显示标题的位置的集合
	 */
 private HashSet<Integer> showPositionSet;
 private FolderDetailListAdapter adapter ;
 class FolderDetailListAdapter extends CursorAdapter{
 public FolderDetailListAdapter(Context context, Cursor c) {
 super(context, c);
 }
 @Override
 public View newView(Context context, Cursor cursor, ViewGroup parent) {
 View view = View.inflate(context, R.layout.list_item_folder_detail, null);
 FolderDetailViewHolder vh = new FolderDetailViewHolder();
			vh.title = (TextView) view.findViewById(R.id.tv_title_list_item);
			vh.face = (ImageView) view.findViewById(R.id.iv_face_list_item);
			vh.address = (TextView) view.findViewById(R.id.tv_address_list_item);
			vh.body = (TextView) view.findViewById(R.id.tv_body_list_item);
			vh.date = (TextView) view.findViewById(R.id.tv_date_list_item);
			view.setTag(vh);
 return view;
 }
 @Override
 public void bindView(View view, Context context, Cursor cursor) {
 FolderDetailViewHolder vh = (FolderDetailViewHolder) view.getTag();
 //TODO  
 //设置短信内容
			vh.body.setText(cursor.getString(INDEX_BODY));
 //设置时间
 long when = cursor.getLong(INDEX_DATE);
 String dateStr;
 if(DateUtils.isToday(when)){
				dateStr = DateFormat.getTimeFormat(context).format(when);
 }else{
				dateStr = DateFormat.getDateFormat(context).format(when);
 }
			vh.date.setText(dateStr);
 //设置联系人的名
 String number = cursor.getString(INDEX_ADDRESS);
 String name = Tools.findNameByNumber(context, number);
 if(name == null){//无此联系人
				vh.address.setText(number);
 }else{
				vh.address.setText(name);
 }
 // 设置头像
 int contactId = Tools.findIDByNumber(context, number);
 if(contactId == -1){ // 无此联系人
				vh.face.setBackgroundResource(R.drawable.ic_unknow_contact_picture);
 }else{
 Bitmap bitmap = Tools.getFaceById(context, ""+contactId);
 if(bitmap ==null){//联系人,无头像
					vh.face.setBackgroundResource(R.drawable.ic_contact_picture);
 }else{
					vh.face.setBackgroundDrawable(new BitmapDrawable(bitmap));
 }
 }
 // 设置标题 
 if(showPositionSet.contains(cursor.getPosition())){ // 如果集合中包含此行,那么,就显示标题 ,
				vh.title.setText(DateFormat.getDateFormat(context).format(when));
				vh.title.setVisibility(View.VISIBLE);
 }else{
 // 否则,就隐藏标题 
				vh.title.setVisibility(View.GONE);
 }
 }
 }
 class FolderDetailViewHolder{
 public TextView title;
 public ImageView face;
 public TextView address;
 public TextView body;
 public TextView date;
 }
 @Override
 /**
	 * 响应新建信息的点击事件
	 */
 public void onClick(View v) {
 Intent intent = new Intent(this,NewMessageUI.class);
		startActivity(intent);
 }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 5.触摸事件、侧滑菜单

    六月的雨
  • Android自动轮播的三种方式

    六月的雨
  • 7.首页、bitmaputils

    六月的雨
  • 第八届蓝桥杯省赛javaB组题目解析

    作者自己做完之后发现省赛的一幕其实是不难的,说实话,自己觉得题目难度还没有PAT甲级的难度高。 而且作者做了这么些天之后发现了,PAT甲级主要喜欢考数据结构方...

    萌萌哒的瓤瓤
  • java(6)——+号和++号--号

    可以见得,当左边或右边为单字符时,加上的是ASCII字符集里面对应的数字,当单独用时,为正号的意思。

    gzq大数据
  • 【编程题】Java编程题一(10道)

    【编程题】Java编程题一(10道) 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,...

    Java帮帮
  • 【编程题】Java编程题三(10道)

    【编程题】Java编程题三(10道) 【程序21】 题目:求1+2!+3!+...+20!的和 public class lianxi21 { publ...

    Java帮帮
  • Java-函数

    方法重载:在同一个类中,出现了方法名相同 不能出现参数名以及参数条件一致的方法 特点:

    DataScience
  • JAVA学习笔记_入门基础

    JAVA学习笔记_入门基础1. 符号及类型1.1 添加注释comment1.2 关键字keywords1.3 标识符1.4 常量1.5 变量和数据类型1.6 数...

    用户7886150
  • 面试官:i = i++和 i = ++i 的有什么区别?

    出处:blog.csdn.net/qq_44377709/article/details/106643703

    开发者技术前线

扫码关注云+社区

领取腾讯云代金券