因为做项目的需要,需要做类似于android自带通信录那样的listview。可以在滑动的时候在中央显示当前列表的首字母或首字。
读了一个通讯录的 代码,学会了如何设置索引。自定义滑块,和在相同的list前加分类。特别是学会了如何监听list里的item里图片。
先上图再说。。
上图是单击了右侧的图片产生的响应。。
首先,来说一下:如何做成在中央显示索引。
主要的思路是在屏幕中央添加一个textview,平时是不可见的。在滑动的时候,显示。在不滑动的时候,让你消失。为了过度自然,有线程延迟。
先上代码:
复制代码
分类:
其实在每一个item之前都会有一个显示。只不过在listadpter的getview时候,判断前后两者是否相同,相同就隐藏。
上代码:
复制代码
在说自定义滑块:
这个需要用的java的反射机制,通过反射修改滑块的照片:
复制代码
最后是如何监听到每一个item的任意view事件:
以前,我总是监听的每一个item,只能整体监听。不过看了这个例子之后学会了怎摸样监听任意的一个view:
首先在定义listadpter时候,定义OnClickListener,在想要监听的view上setOnClickListener,
并设置它的tag。
在单击事件中,通过instanceof,判断是否是单击的该view,通过tag来获得所单击的下标。
并进行响应的操作,
再上代码:
这个是单击事件的代码:
复制代码
复制代码
读了一个通讯录的 代码,学会了如何设置索引。自定义滑块,和在相同的list前加分类。特别是学会了如何监听list里的item里图片。
先上图再说。。
上图是单击了右侧的图片产生的响应。。
首先,来说一下:如何做成在中央显示索引。
主要的思路是在屏幕中央添加一个textview,平时是不可见的。在滑动的时候,显示。在不滑动的时候,让你消失。为了过度自然,有线程延迟。
先上代码:
- txtOverlay = (TextView) LayoutInflater.from(this).inflate(R.layout.popup_char_hint, null);
- txtOverlay.setVisibility(View.INVISIBLE);
- WindowManager.LayoutParams lp = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION,
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT);
- windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
- windowManager.addView(txtOverlay, lp);
分类:
其实在每一个item之前都会有一个显示。只不过在listadpter的getview时候,判断前后两者是否相同,相同就隐藏。
上代码:
- int idx = position - 1;
- char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' ';
- char currentChar = stringArr[position].charAt(0);
- if (currentChar != previewChar) {
- holder.firstCharHintTextView.setVisibility(View.VISIBLE);
- holder.firstCharHintTextView.setText(String.valueOf(currentChar));
- } else {
- holder.firstCharHintTextView.setVisibility(View.GONE);
- }
在说自定义滑块:
这个需要用的java的反射机制,通过反射修改滑块的照片:
- try {
- Field f = AbsListView.class.getDeclaredField("mFastScroller");
- f.setAccessible(true);
- Object obj = f.get(list);
- f = f.getType().getDeclaredField("mThumbDrawable");
- f.setAccessible(true);
- Drawable drawable = (Drawable) f.get(obj);
- drawable = getResources().getDrawable(R.drawable.fast_scroller_img);
- f.set(obj, drawable);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
以前,我总是监听的每一个item,只能整体监听。不过看了这个例子之后学会了怎摸样监听任意的一个view:
首先在定义listadpter时候,定义OnClickListener,在想要监听的view上setOnClickListener,
并设置它的tag。
在单击事件中,通过instanceof,判断是否是单击的该view,通过tag来获得所单击的下标。
并进行响应的操作,
再上代码:
这个是单击事件的代码:
- public void onClick(View view) {
- if (view instanceof ImageView) {
- int position = ((Integer) view.getTag()).intValue();
- ActionItem actionAdd = new ActionItem(getResources().getDrawable(R.drawable.icon_info),
- "打电话", this);
- ActionItem actionEMail = new ActionItem(getResources().getDrawable(
- R.drawable.icon_email), "发短信", this);
- QuickActionBar qaBar = new QuickActionBar(view, position);
- qaBar.setEnableActionsLayoutAnim(true);
- qaBar.addActionItem(actionAdd);
- qaBar.addActionItem(actionEMail);
- qaBar.show();
- } else if (view instanceof LinearLayout) {
- // ActionItem组件
- LinearLayout actionsLayout = (LinearLayout) view;
- QuickActionBar bar = (QuickActionBar) actionsLayout.getTag();
- bar.dismissQuickActionBar();
- int listItemIdx = bar.getListItemIndex();
- TextView txtView = (TextView) actionsLayout.findViewById(R.id.qa_actionItem_name);
- String actionName = txtView.getText().toString();
- String personalName = stringArr[listItemIdx];
- String url = ListAdapter.URL_PREFIX + personalName.replace(" ", "%20");
- if (actionName.equals("打电话")) {
- showInfo(personalName, url);
- } else if (actionName.equals("发短信")) {
- sendEMail(personalName, url);
- }
- }
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- if (convertView == null) {
- convertView = layoutInflater.inflate(R.layout.nongzi_list_item, null);
- holder = new ViewHolder();
- holder.firstCharHintTextView = (TextView) convertView
- .findViewById(R.id.text_first_char_hint);
- holder.nameTextView = (TextView) convertView.findViewById(R.id.text_website_name);
- holder.urlTextView = (TextView) convertView.findViewById(R.id.text_website_url);
- holder.imgView = (ImageView) convertView.findViewById(R.id.list_item_img_view);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- holder.nameTextView.setText(stringArr[position]);
- holder.urlTextView.setText(URL_PREFIX + stringArr[position]);
- holder.urlTextView.setTextColor(0xFFFFFF00);
- holder.imgView.setOnClickListener(onClickListener);
- holder.imgView.setTag(position);
- int idx = position - 1;
- char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' ';
- char currentChar = stringArr[position].charAt(0);
- if (currentChar != previewChar) {
- holder.firstCharHintTextView.setVisibility(View.VISIBLE);
- holder.firstCharHintTextView.setText(String.valueOf(currentChar));
- } else {
- holder.firstCharHintTextView.setVisibility(View.GONE);
- }
- return convertView;
- }