`
104zz
  • 浏览: 1507780 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
阅读更多

基本上很多应用都是用了这个功能当数据多时方便快速查看浏览定位查询等,本案例功能比较简单,需要跟完善的话就要继续优化。

先上运行效果图如下:

 


 

 

第一步:首相自定义SideBar类继承View类,用于绘制A-Z文字控件,如下:

 

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;

public class SideBar extends View {
	private char[] l;
	private SectionIndexer sectionIndexter = null;
	private ListView list;
	private TextView mDialogText;
	Bitmap mbitmap;
	private int type = 1;
	private int color = 0xff858c94;

	public SideBar(Context context) {
		super(context);
		init();
	}

	public SideBar(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	private void init() {

		l = new char[] { '!','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
		 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
		  'W', 'X', 'Y', 'Z','#'};
		mbitmap = BitmapFactory.decodeResource(getResources(),
				R.drawable.scroll_bar_search_icon);
	}

	public SideBar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}


	public void setListView(ListView _list) {
		list = _list;
		HeaderViewListAdapter ha = (HeaderViewListAdapter) _list
				.getAdapter();
		MyAdapter ad = (MyAdapter)ha.getWrappedAdapter();
		sectionIndexter = (SectionIndexer) ad;
		
	}

	public void setTextView(TextView mDialogText) {
		this.mDialogText = mDialogText;
	}

	public boolean onTouchEvent(MotionEvent event) {

		super.onTouchEvent(event);
		int i = (int) event.getY();

		int idx = i / (getMeasuredHeight() / l.length);
		if (idx >= l.length) {
			idx = l.length - 1;
		} else if (idx < 0) {
			idx = 0;
		}
		if (event.getAction() == MotionEvent.ACTION_DOWN
				|| event.getAction() == MotionEvent.ACTION_MOVE) {
			setBackgroundResource(R.drawable.scrollbar_bg);
			mDialogText.setVisibility(View.VISIBLE);
			if (idx == 0) {
				mDialogText.setText("Search");
				mDialogText.setTextSize(16);
			} else {
				mDialogText.setText(String.valueOf(l[idx]));
				mDialogText.setTextSize(34);
			}
			if (sectionIndexter == null) {

			

				sectionIndexter = (SectionIndexer) list.getAdapter();
				
			}
			int position = sectionIndexter.getPositionForSection(l[idx]);

			if (position == -1) {
				return true;
			}
			list.setSelection(position);
		} else {
			mDialogText.setVisibility(View.INVISIBLE);

		}
		if (event.getAction() == MotionEvent.ACTION_UP) {
			setBackgroundDrawable(new ColorDrawable(0x00000000));
		}
		return true;
	}

	protected void onDraw(Canvas canvas) {
		Paint paint = new Paint();
		paint.setColor(color);
		paint.setTextSize(12);
		paint.setStyle(Style.FILL);		
		paint.setTextAlign(Paint.Align.CENTER);
		float widthCenter = getMeasuredWidth() / 2;
		if (l.length > 0) {
			float height = getMeasuredHeight() / l.length;
			for (int i = 0; i < l.length; i++) {
				if (i == 0 && type != 2) {
					canvas.drawBitmap(mbitmap, widthCenter - 7, (i + 1)
							* height - height / 2, paint);
				} else
					canvas.drawText(String.valueOf(l[i]), widthCenter,
							(i + 1) * height, paint);
			}
		}
		this.invalidate();
		super.onDraw(canvas);
	}
}

 

 

第二步:设计xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="@null" />

    <com.example.listsildedel.SideBar
        android:id="@+id/sideBar"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical" />

</FrameLayout>

 

第三步:创建MyAdapter继承BaseAdapter并实现SectionIndexer接口注意这里一定要实现这个接口以便实现对应a-z的选择定位功能:

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter implements SectionIndexer{

	private List<Content> list = null;
	private Context mContext;
	private SectionIndexer mIndexer;
	
	public MyAdapter(Context mContext, List<Content> list) {
		this.mContext = mContext;
		this.list = list;

	}

	public int getCount() {
		return this.list.size();
	}

	public Object getItem(int position) {
		return null;
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(final int position, View view, ViewGroup arg2) {
		ViewHolder viewHolder = null;
		if (view == null) {
			viewHolder = new ViewHolder();
			view = LayoutInflater.from(mContext).inflate(R.layout.item, null);
			viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
			viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
			view.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) view.getTag();
		}
		final Content mContent = list.get(position);
		if (position == 0) {
			viewHolder.tvLetter.setVisibility(View.VISIBLE);
			viewHolder.tvLetter.setText(mContent.getLetter());
		} else {
			String lastCatalog = list.get(position - 1).getLetter();
			if (mContent.getLetter().equals(lastCatalog)) {
				viewHolder.tvLetter.setVisibility(View.GONE);
			} else {
				viewHolder.tvLetter.setVisibility(View.VISIBLE);
				viewHolder.tvLetter.setText(mContent.getLetter());
			}
		}
	
		viewHolder.tvTitle.setText(this.list.get(position).getName());
		
		return view;

	}
	


	final static class ViewHolder {
		TextView tvTitle;
		TextView tvLetter;
	}


	public Object[] getSections() {
		// TODO Auto-generated method stub
		return null;
	}

	public int getSectionForPosition(int position) {
		
		return 0;
	}

	public int getPositionForSection(int section) {
		Content mContent;
		String l;
		if (section == '!') {
			return 0;
		} else {
			for (int i = 0; i < getCount(); i++) {
				mContent = (Content) list.get(i);
				l = mContent.getLetter();
				char firstChar = l.toUpperCase().charAt(0);
				if (firstChar == section) {
					return i + 1;
				}

			}
		}
		mContent = null;
		l = null;
		return -1;
	}
}

 第四步:编写MainActivity类

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private ListView mListView;
	private SideBar indexBar;
	private WindowManager mWindowManager;
	private TextView mDialogText;
	private View head;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		 //启动activity时不自动弹出软键盘
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mListView = (ListView) this.findViewById(R.id.list);
		indexBar = (SideBar) findViewById(R.id.sideBar);
		mDialogText = (TextView) LayoutInflater.from(this).inflate(R.layout.list_position, null);
		head = LayoutInflater.from(this).inflate(R.layout.head, null);
		mListView.addHeaderView(head);
		mDialogText.setVisibility(View.INVISIBLE);
		mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
		WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
				WindowManager.LayoutParams.TYPE_APPLICATION,
				WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
						| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
				PixelFormat.TRANSLUCENT);
		mWindowManager.addView(mDialogText, lp);
		indexBar.setTextView(mDialogText);
		//初始化数据
		List<Content> list = new ArrayList<Content>();
		for (int i = 0; i < 10; i++) {
			Content m;
			if (i < 3)
				m = new Content("A", "选项" + i);
			else if (i < 6)
				m = new Content("F", "选项" + i);
			else
				m = new Content("D", "选项" + i);
			list.add(m);
		}
		//根据a-z进行排序
		Collections.sort(list, new PinyinComparator());
		// 实例化自定义内容适配类		
		MyAdapter adapter = new MyAdapter(this, list);
		// 为listView设置适配
		mListView.setAdapter(adapter);
		//设置SideBar的ListView内容实现点击a-z中任意一个进行定位
	    indexBar.setListView(mListView);		
	}

}
 源码已上传有需要参考的可以下载研究下,然后自己完善需要的功能。
  • 大小: 49.9 KB
5
1
分享到:
评论
2 楼 Becky00 2015-01-05  
太感谢啦
1 楼 lianlupengUestc 2013-03-28  
浮动层弹不出来

相关推荐

    android ListView根据字母排序和定位----支持混合排序

    实现的功能:混合字符串处理 中英文排序 右侧悬浮栏 顶部名称提示栏 滚动悬浮提示,文件里放置了运行的效果图,实现的效果还是让人很满意的 我开发的环境是intellij idea, 导入到eclipse要注意处理一些问题,具体...

    AndroidListView侧栏字母条索引定位demo

    总之,"AndroidListView侧栏字母条索引定位demo"是一个学习和实践如何在Android应用中增强ListView用户体验的好资源。它结合了数据处理、视图渲染、事件监听和布局设计等多个方面的知识点,对于提升Android开发技能...

    安卓A-Z字母排序索引相关-AndroidListView侧栏字母条索引定位.rar

    本资源"安卓A-Z字母排序索引相关-AndroidListView侧栏字母条索引定位.rar"主要涉及如何在ListView中实现这种功能,即侧栏字母条索引定位。 首先,我们需要理解ListView的工作原理。ListView通过Adapter(适配器)将...

    android listView字母排列

    "android listView字母排列"就是这样一个功能,它允许用户通过点击侧边栏的字母来快速跳转到对应的列表项。下面我们将详细讨论如何实现这个功能。 1. **ListView的基本使用** - ListView是Android SDK中的一个视图...

    安卓listview相关相关-Android中ListView字母排序实现字母挤压效果以及右侧快速选中字母搜索关键字功能.rar

    本资源"安卓listview相关相关-Android中ListView字母排序实现字母挤压效果以及右侧快速选中字母搜索关键字功能.rar"聚焦于优化ListView的用户体验,特别是对于长列表的数据展示。下面将详细解释其中涉及的关键知识点...

    Android ListView的字母索引排序和搜索

    总结,Android中的ListView字母索引排序和搜索功能的实现,涉及数据源的排序、字母索引栏的创建与更新以及搜索事件的监听与响应。通过这些步骤,可以构建出高效且易用的列表界面,提升用户的使用体验。

    Android实现ListView的A-Z字母排序和过滤搜索功能完整实例源码

    Android实现ListView的A-Z字母排序和过滤搜索功能,完整源码,小伙伴需要的来CSDN下载吧!项目详情http://blog.csdn.net/xiaanming/article/details/12684155

    Android应用源码之带有拼音首字母排序的listview.zip

    本示例源码“Android应用源码之带有拼音首字母排序的listview”着重于如何在ListView中实现基于拼音首字母的排序功能,这在中文应用中非常常见,如联系人应用或各类列表检索。下面将详细介绍这一功能的实现原理和...

    android实现ListView字母排序并调整字母位置

    总的来说,实现"android实现ListView字母排序并调整字母位置"涉及了数据排序、自定义视图、事件监听以及滚动同步等多个Android开发中的核心知识点。通过这样的实践,开发者可以更好地理解和掌握Android UI组件的使用...

    Android ListView首字母索引

    在处理如联系人、商品等按首字母排序的数据时,为了方便用户快速定位到所需内容,通常会添加一个首字母索引栏。这个功能常见于手机通讯录应用,用户可以通过点击字母栏直接跳转到对应的姓氏首字母。本文将详细探讨...

    Android ListView实现A-Z字母排序

    在实际应用中,我们经常需要对ListView的数据进行A-Z字母排序,以便用户能够更快速地查找和浏览内容。本教程将详细介绍如何在Android中实现ListView的A-Z字母排序功能。 首先,我们需要理解ListView的基本结构。...

    android ListView 按字母 检索

    综上所述,实现"android ListView 按字母检索"涉及到的关键技术点包括:ListView的使用、Adapter的设计、SectionIndexer接口的实现、数据源的排序、快速滚动条的设置、自定义视图和性能优化。通过这些技术,我们可以...

    Android ListView城市列表,按a-z分组字母索引排序

    总结一下,实现"Android ListView城市列表,按a-z分组字母索引排序"的关键步骤包括: 1. 数据预处理:排序和分组城市名。 2. 创建适配器:处理数据并绑定到ListView。 3. 实现分组头部:根据首字母创建SectionHeader...

    Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能

    总结来说,实现"Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能"涉及到以下关键知识点: 1. ListView的使用和Adapter机制 2. 数据排序与Comparator 3. 字母导航栏的创建与点击事件处理 4. EditText...

    Android 使用ListView的A-Z字母排序功能实现联系人模块

    综上所述,实现Android的ListView A-Z字母排序功能和搜索过滤,主要涉及数据排序、拼音转换、适配器的自定义、事件监听和用户交互设计等多个方面。通过合理的代码结构和优化,可以提供一个高效、友好的联系人管理...

    android listview仿照微信联系人字母排序

    在"android listview仿照微信联系人字母排序"这个项目中,我们将实现一个类似微信的联系人列表,用户可以通过字母快速定位并搜索联系人。这个功能对于拥有大量联系人的应用来说非常实用,提高了用户体验。 首先,...

    Android ListView字母排序过滤搜索

    Android ListView字母排序过滤搜索,注释详细,可下载使用!

    android根据字母排序的城市列表

    在Android开发中,构建一个根据字母排序的城市列表是一项常见的任务,尤其在开发地图应用或信息检索类应用时。这个任务涉及到UI设计、数据处理以及排序算法等多个知识点。下面将详细阐述实现这一功能所需的关键技术...

    安卓A-Z字母排序索引相关-ListviewFilter-master(listView右侧字母索引).zip

    【标题】"安卓A-Z字母排序索引相关-ListviewFilter-master(listView右侧字母索引)"涉及的是在Android开发中,如何实现ListView的快速索引功能。这种功能常见于通讯录应用,用户可以通过左侧或右侧的字母栏快速定位到...

    Android 实现ListView的A-Z字母排序和过滤搜索功能

    总结一下,实现Android ListView的A-Z字母排序和过滤搜索功能主要涉及以下几个步骤: 1. 创建数据源并进行A-Z排序。 2. 设计ListView适配器,绑定数据。 3. 添加搜索框,监听输入事件,实时过滤数据源并更新...

Global site tag (gtag.js) - Google Analytics