`

ListView实现简单的关键字高亮显示

阅读更多
这个是网上找的.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.text.Editable;
import android.text.Html;
import android.text.Spanned;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SlidingDrawer;
import android.widget.TextView;

public class DemoHomeActivity extends Activity {
	
	private static final String TAG = "DemoHomeActivity";
	private SlidingDrawer mDrawer;
	private TextView input_tv;
	private EndClosedMyDrawer mClosedDrawer;
	private ListView listview;
	
	private String [] test = new String[]{"010668971455","020132456","01058585896","02168000000","02168000001","1372160485","195369871"};
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        init();
        
		mClosedDrawer = new EndClosedMyDrawer(5000,1000);
		new UpdateListTask().execute(getTextNumber());
    }
    
    
    
	protected void onRestart() {
		new UpdateListTask().execute(getTextNumber());
		super.onRestart();
	}



	public void init(){
    	mDrawer=(SlidingDrawer)findViewById(R.id.slidingdrawer);
		input_tv = (TextView)findViewById(R.id.input_dialpad_tv);
		listview = (ListView)findViewById(R.id.listview);
		input_tv.addTextChangedListener(watcher);
    }
    
    private TextWatcher watcher = new TextWatcher() {
		
		public void onTextChanged(CharSequence s, int start, int before, int count) {
			// TODO Auto-generated method stub
		}
		
		public void beforeTextChanged(CharSequence s, int start, int count,
				int after) {
			
		}
		
		public void afterTextChanged(Editable s) {
			new UpdateListTask().execute(getTextNumber());
		}
	};
    
	
    private void keyPressed ( int keyCode ){
 		mDrawer.open();
 		try{
 			mClosedDrawer.cancel();
 		}catch (Exception e) {
 			Log.i(TAG, "This is the first run updatelist Countdown!");
 		}
 		mClosedDrawer.start();
    }
    
    public boolean onKeyDown(int keyCode, KeyEvent event){
	    switch (keyCode){
	        case KeyEvent.KEYCODE_0 :
	            keyPressed(KeyEvent.KEYCODE_0);
				input_tv.append("0");
	        break;

	        case KeyEvent.KEYCODE_1 :
                keyPressed(KeyEvent.KEYCODE_1);
	            input_tv.append("1");
	        break;

	        case KeyEvent.KEYCODE_2 :
	            keyPressed(KeyEvent.KEYCODE_2);
				input_tv.append("2");
	        break;

	        case KeyEvent.KEYCODE_3 :
	            keyPressed(KeyEvent.KEYCODE_3);
				input_tv.append("3");
	        break;

	        case KeyEvent.KEYCODE_4 :
	            keyPressed(KeyEvent.KEYCODE_4);
				input_tv.append("4");
	        break;

	        case KeyEvent.KEYCODE_5 :
	            keyPressed(KeyEvent.KEYCODE_5);
				input_tv.append("5");
	        break;

	        case KeyEvent.KEYCODE_6 :
	            keyPressed(KeyEvent.KEYCODE_6);
				input_tv.append("6");
	        break;

	        case KeyEvent.KEYCODE_7 :
	            keyPressed(KeyEvent.KEYCODE_7);
				input_tv.append("7");
	        break;

	        case KeyEvent.KEYCODE_8 :
	            keyPressed(KeyEvent.KEYCODE_8);
				input_tv.append("8");
	        break;

	        case KeyEvent.KEYCODE_9 :
	            keyPressed(KeyEvent.KEYCODE_9);
				input_tv.append("9");
	        break;

	        case KeyEvent.KEYCODE_STAR :
	            keyPressed(KeyEvent.KEYCODE_STAR);
				input_tv.append("*");
	        break;

	        case KeyEvent.KEYCODE_POUND :
	            keyPressed(KeyEvent.KEYCODE_POUND);
				input_tv.append("#");
	        break;
	        
	        case KeyEvent.KEYCODE_DEL:
	            keyPressed(KeyEvent.KEYCODE_DEL);
				CharSequence str = "";
				str = input_tv.getText();
				if(str != null && str.length() > 0){
					String temp = str.toString();
					if(temp.length() == 1){
						input_tv.setText("");
					}else if(temp.length() > 1){
						input_tv.setText(temp.subSequence(0, temp.length()-1));
					}
				}
	        break;
	        default:
				return super.onKeyDown(keyCode, event);
	    }
        return true;
	}
    
    
    /**
	 * Customize Adapter, so that realize highlighted keywords
	 */
	private  class HightKeywordsAdapter extends BaseAdapter{
		private List list;
		private Context context;
		private String[] from;
		private int[] to;
		private int layoutid;
		private HashMap info;
		LayoutInflater myInflater;
		HashMap item; 

		public HightKeywordsAdapter(Context context, List list, int layoutid, String[] from,int[] to){
			this.context = context;
			this.list = list;
			this.from = from;
			this.to = to;
			this.layoutid = layoutid;
		}
		
		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}
		
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return list.get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			myInflater = LayoutInflater.from(context);
			try
			{
				item = (HashMap) list.get(position);
				convertView = myInflater.inflate(layoutid, null);
				convertView.setTag(item);
			}catch (Exception e) {
				Log.e(TAG, "Hight Key Error! ");
			}	
			
			View number = convertView.findViewById(to[0]);
			
			if (number instanceof TextView) {
				TextView number_tv = (TextView) number;
				number_tv = (TextView) number;
				String number_temp = "";
				number_temp = item.get(from[0]).toString();
				
				String input = input_tv.getText().toString();
				
				if(number_temp.contains(input)){
					
					//Methods 1
					int index = number_temp.indexOf(input);
					int len = input.length();
					Spanned temp = Html.fromHtml(number_temp.substring(0, index)
					         + "<u><font color=#5DB43B>" + number_temp.substring(index, index + len)
					         + "</font></u>" + number_temp.substring(index + len, number_temp.length()));
					
					//Methods 2
					/*int start = number.indexOf(input);   
					SpannableStringBuilder style=new SpannableStringBuilder(number);   
					style.setSpan(new Tex(Color.RED), start, start + input.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
					*/
					number_tv.setText(temp);
				}
			}
			return convertView;
		}		
	}
	
	private synchronized List updateNumberslist(String input)
	{
		List list = new ArrayList<HashMap<String, String>>();
		if(input == null)
		{
			for(int i=0;i<test.length;i++){
				HashMap<String, String> number_info = new HashMap<String, String>();
				number_info.put("number", test[i]);
				list.add(number_info);
			}
		}
		else
		{
			for(int i=0;i<test.length;i++){
				
				if(test[i].contains(input)){
					HashMap<String, String> number_info = new HashMap<String, String>();
					number_info.put("number", test[i]);
					list.add(number_info);
				}
			}
		}
		return list;
	}
	
	private String getTextNumber(){
		if(input_tv.getText() != null && input_tv.getText().length() > 0){
			return input_tv.getText().toString();
		}else{
			return null;
		}
	}
	
	private class UpdateListTask extends AsyncTask<String, Integer, BaseAdapter>
	{
		protected BaseAdapter doInBackground(String... params) {
			
			BaseAdapter listAdapter = new HightKeywordsAdapter(DemoHomeActivity.this, 
					updateNumberslist(getTextNumber()),
					android.R.layout.simple_list_item_1,
					new String[] {"number" },
					new int[] {android.R.id.text1 });
			
			return listAdapter;
		}

		protected void onPostExecute(BaseAdapter result) {
			listview.setAdapter(result);
		}
	}
	
    //计数器
    private class EndClosedMyDrawer extends CountDownTimer {
	    public EndClosedMyDrawer(long millisInFuture, long countDownInterval){
	      super(millisInFuture, countDownInterval);
	    }    
	    
	    public void onFinish(){
	    	//Log.i(TAG, "Start asyncTask to updateList !");
	    	mDrawer.close();
	    }
	    
	    public void onTick(long millisUntilFinished){
	    	
		}  	    
	}
}
  • 大小: 33.2 KB
分享到:
评论

相关推荐

    ListView搜索关键字高亮显示

    在这个主题中,我们将深入探讨如何实现ListView中的搜索关键字高亮显示功能。 首先,我们需要理解搜索功能的基本原理。在Android应用中,通常会有一个搜索框(EditText)供用户输入关键字,当用户输入内容时,我们...

    Android listview item高亮显示

    要实现关键字高亮,我们可以遵循以下步骤: 1. **创建自定义Adapter**:首先,你需要创建一个自定义的Adapter,继承自BaseAdapter或ArrayAdapter。在自定义Adapter中,我们需要重写`getView()`方法,因为这是决定每...

    ListView的item文本高亮,下划线,匹配关键字点击监听

    在某些场景下,我们可能需要对ListView中的每一项(item)进行特定的文本处理,比如高亮显示某个关键词、添加下划线以及监听点击事件。在这个案例中,我们将详细探讨如何实现这些功能。 首先,我们需要创建一个...

    android 搜索功能 SearchView+RecyclerView实现 搜索结果高亮显示

    要实现高亮显示,我们需要在`Adapter`的`bindViewHolder()`方法中,根据查询关键字对数据进行处理,然后更新对应的视图元素(如TextView)以突出显示匹配的文本。 具体实现步骤如下: 1. 创建`SearchView`实例并...

    Android 实现ListView的A-Z字母排序和模糊查询功能,可以汉字和拼音转换(多音字暂不支持)

    为了高亮显示匹配部分,可以修改ListView项的布局,设置一个可变颜色的SpannableString,使关键词在显示时以特殊颜色突出。 接下来,我们关注AndroidManifest.xml文件,这是应用配置的核心。在这里,你需要声明你的...

    Listview控件常用方法.docx

    设置是否整行选择模式,当设置为 True 时,当点击某行时能整行高亮显示,不然只会选择该行的第一列。默认值 False。只有在 lvwReport 视图该属性才有意义。 2. GridLines:设置是否显示网格线。默认值 False。只有...

    Qt / Qml 实现历史编辑器 ( 支持历史搜索 & 关键字匹配 )

    高亮显示关键字是在搜索结果中突出显示与用户输入相匹配的部分,以提高可读性。在Qml中,我们可以利用`Text`元素的样式属性,如`font.bold`或自定义CSS样式来实现高亮效果。在搜索结果显示时,需要动态地修改这些...

    listview右则搜索

    4. 反馈:在ListView中,可以使用HeaderView和FooterView来增强用户体验,例如显示当前选中的字母,以及高亮显示对应的首字母索引条目。 四、优化与性能 1. 使用ViewHolder模式:为了提高ListView的滚动性能,推荐...

    第7章 数据绑定控件

    第7章 数据绑定控件 300 7.1 数据绑定技术 301 实例188 格式化订货金额和订单日期并 进行绑定 301 实例189 使用绑定表达式高亮显示搜索关键字 302 ...实例243 高亮显示ListView中的数据行并实现 图片自动变换 384

    Android基于RecyclerView实现高亮搜索列表

    在Adapter的`onBindViewHolder()`方法中,根据接收到的key值,遍历每个Item的数据,使用StringFormatUtil或其他类似工具,将匹配的关键字高亮显示。这通常涉及到字符串操作,比如使用`indexOf()`查找关键字位置,...

    Android-Android搜索结果显示高亮(有数据滑动底部自动刷新)

    为了实现高亮显示,我们需要在搜索结果列表的适配器(如RecyclerView或ListView)中处理数据。当用户输入搜索关键词时,可以遍历列表项,找出与关键词匹配的部分,并使用SpannableString和 ForegroundColorSpan 或者...

    安卓搜索相关相关-二种方式匹配关键字改变颜色.zip匹配搜索关键字改变颜色.rar

    本文将探讨如何通过两种不同的方法实现关键字匹配并改变显示颜色,这是提升用户体验的有效手段。在描述中提到的“二种方式,匹配关键字、改变颜色.zip 匹配搜索关键字改变颜色.rar”可能包含示例代码或项目,但具体...

    ListView控件属性、方法、事件

    - **功能**: 设置或返回是否整行高亮显示。 - **值**: - `True`: 整行高亮。 - `False`: 单元格高亮。 **12. HotTracking** - **功能**: 设置或返回是否启用热点跟踪,鼠标指针变为手形。 - **值**: - `True`: ...

    WPF 下拉列表框ComboBox扩展控件

    自动选择意味着当用户展开ComboBox时,根据特定条件(如当前焦点或搜索关键字)自动高亮一个合适的选项。自动滚屏则确保当前选中的项目始终可见,即使列表内容过多导致滚动。 在实现这些特性时,我们需要使用WPF的...

    Android自定义控件之实现快速检索代码

    首先,我们需要了解Android的基本组件,如EditText用于用户输入查询关键字,ListView或RecyclerView则用来展示过滤后的结果。在创建自定义控件时,我们可能需要结合这两个组件,构建一个一体化的搜索框和结果显示区...

Global site tag (gtag.js) - Google Analytics