读通讯录源码。学会了列表索引,自定义滑块等、、

     因为做项目的需要,需要做类似于android自带通信录那样的listview。可以在滑动的时候在中央显示当前列表的首字母或首字。
读了一个通讯录的 代码,学会了如何设置索引。自定义滑块,和在相同的list前加分类。特别是学会了如何监听list里的item里图片。
先上图再说。。
1.png 

2.png 

上图是单击了右侧的图片产生的响应。。
  首先,来说一下:如何做成在中央显示索引。
主要的思路是在屏幕中央添加一个textview,平时是不可见的。在滑动的时候,显示。在不滑动的时候,让你消失。为了过度自然,有线程延迟。
   先上代码:
  1. txtOverlay = (TextView) LayoutInflater.from(this).inflate(R.layout.popup_char_hint, null);
  2.                 txtOverlay.setVisibility(View.INVISIBLE);
  3.                 WindowManager.LayoutParams lp = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,
  4.                                 LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION,
  5.                                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  6.                                                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT);
  7.                 windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
  8.                 windowManager.addView(txtOverlay, lp);
复制代码


分类:
其实在每一个item之前都会有一个显示。只不过在listadpter的getview时候,判断前后两者是否相同,相同就隐藏。
上代码:
  1. int idx = position - 1;
  2.                 char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' ';
  3.                 char currentChar = stringArr[position].charAt(0);
  4.                 if (currentChar != previewChar) {
  5.                         holder.firstCharHintTextView.setVisibility(View.VISIBLE);
  6.                         holder.firstCharHintTextView.setText(String.valueOf(currentChar));
  7.                 } else {
  8.                         holder.firstCharHintTextView.setVisibility(View.GONE);
  9.                 }
复制代码


在说自定义滑块:
  这个需要用的java的反射机制,通过反射修改滑块的照片:
  1. try {
  2.                         Field f = AbsListView.class.getDeclaredField("mFastScroller");
  3.                         f.setAccessible(true);
  4.                         Object obj = f.get(list);
  5.                         f = f.getType().getDeclaredField("mThumbDrawable");
  6.                         f.setAccessible(true);
  7.                         Drawable drawable = (Drawable) f.get(obj);
  8.                         drawable = getResources().getDrawable(R.drawable.fast_scroller_img);
  9.                         f.set(obj, drawable);
  10.                 } catch (Exception e) {
  11.                         throw new RuntimeException(e);
  12.                 }
复制代码
最后是如何监听到每一个item的任意view事件:
以前,我总是监听的每一个item,只能整体监听。不过看了这个例子之后学会了怎摸样监听任意的一个view:
首先在定义listadpter时候,定义OnClickListener,在想要监听的view上setOnClickListener,
并设置它的tag。
在单击事件中,通过instanceof,判断是否是单击的该view,通过tag来获得所单击的下标。
并进行响应的操作,
再上代码:
这个是单击事件的代码:

  1. public void onClick(View view) {
  2.                 if (view instanceof ImageView) {
  3.                         int position = ((Integer) view.getTag()).intValue();
  4.                         ActionItem actionAdd = new ActionItem(getResources().getDrawable(R.drawable.icon_info),
  5.                                         "打电话", this);
  6.                         ActionItem actionEMail = new ActionItem(getResources().getDrawable(
  7.                                         R.drawable.icon_email), "发短信", this);
  8.                         QuickActionBar qaBar = new QuickActionBar(view, position);
  9.                         qaBar.setEnableActionsLayoutAnim(true);
  10.                         qaBar.addActionItem(actionAdd);
  11.                         qaBar.addActionItem(actionEMail);
  12.                         qaBar.show();
  13.                 } else if (view instanceof LinearLayout) {
  14.                         // ActionItem组件
  15.                         LinearLayout actionsLayout = (LinearLayout) view;
  16.                         QuickActionBar bar = (QuickActionBar) actionsLayout.getTag();
  17.                         bar.dismissQuickActionBar();
  18.                         int listItemIdx = bar.getListItemIndex();
  19.                         TextView txtView = (TextView) actionsLayout.findViewById(R.id.qa_actionItem_name);
  20.                         String actionName = txtView.getText().toString();
  21.                         String personalName = stringArr[listItemIdx];
  22.                         String url = ListAdapter.URL_PREFIX + personalName.replace(" ", "%20");
  23.                         if (actionName.equals("打电话")) {
  24.                                 showInfo(personalName, url);
  25.                         } else if (actionName.equals("发短信")) {
  26.                                 sendEMail(personalName, url);
  27.                         }
  28.                 }
  29.         }
复制代码
  1. public View getView(int position, View convertView, ViewGroup parent) {
  2.                 ViewHolder holder = null;
  3.                 if (convertView == null) {
  4.                         convertView = layoutInflater.inflate(R.layout.nongzi_list_item, null);
  5.                         holder = new ViewHolder();
  6.                         holder.firstCharHintTextView = (TextView) convertView
  7.                                         .findViewById(R.id.text_first_char_hint);
  8.                         holder.nameTextView = (TextView) convertView.findViewById(R.id.text_website_name);
  9.                         holder.urlTextView = (TextView) convertView.findViewById(R.id.text_website_url);
  10.                         holder.imgView = (ImageView) convertView.findViewById(R.id.list_item_img_view);
  11.                         convertView.setTag(holder);
  12.                 } else {
  13.                         holder = (ViewHolder) convertView.getTag();
  14.                 }
  15.                 holder.nameTextView.setText(stringArr[position]);
  16.                 holder.urlTextView.setText(URL_PREFIX + stringArr[position]);
  17.                 holder.urlTextView.setTextColor(0xFFFFFF00);
  18.                 holder.imgView.setOnClickListener(onClickListener);
  19.                 holder.imgView.setTag(position);
  20.                 int idx = position - 1;
  21.                 char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' ';
  22.                 char currentChar = stringArr[position].charAt(0);
  23.                 if (currentChar != previewChar) {
  24.                         holder.firstCharHintTextView.setVisibility(View.VISIBLE);
  25.                         holder.firstCharHintTextView.setText(String.valueOf(currentChar));
  26.                 } else {
  27.                         holder.firstCharHintTextView.setVisibility(View.GONE);
  28.                 }
  29.                 return convertView;
  30.         }
复制代码
这个是listadpter的getview的代码。

最后上源代码。同时欢迎大家的指正。。。  Demo.rar 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值