因为做项目的需要,需要做类似于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;
-
}