AutoCompleteTextView 自定义adapter。 可以添加List<Map<String,Object>>

本文介绍了如何扩展AutoCompleteTextView,实现一个自定义的adapter来支持List<Map<String, Object>>数据源。通过实现Filterable接口,我们可以根据需求进行复杂的过滤操作,即使在数据源中涉及多列检索。通过继承BaseAdapter并实现ArrayListFilter,自定义adapter的创建并不复杂,对于熟悉ListView的开发者来说尤为简单。" 123478345,10969815,理解JDK文件目录与环境变量配置,"['Java', '开发语言', 'JDK', '环境配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上的AutoCompleteTextView 基本都是 List<String>   adapter。基于此实现了 自定义的adapter.

其实使用AutoCompleteTextView就得实现过滤器Filterable,你得告诉它怎么过滤。由于ArrayAdapter已经帮我们实现了Filterable接口,所以我们很容易忽略这个,以为AutoCompleteTextView用起来很简单。如果你使用的是BaseAdapter呢?当然,事实上也不难,只要让它也实现Filterable接口就可以了。


过程:

  1. 定义一个autocompletetextview。然后定义一个要显示下拉item的布局文件。
  2. 自定义adapter. 我们需要继承BaseAdapter,同时需要实现过滤器ArrayListFilter。 baseAdapter 跟普通的列表操作基本一致。需要显示的数据为数据源。ArrayListFilter中,我们需要自己去过滤数据源。这一部分读者可能会觉得很难,其实就看你自己的需求了。一般的只要利用String.contains就可以解决了。当然有时候我们会需要同时检索2列,如本例所示。
  3. 基本完成了。代码其实非常简单。只要是熟悉了ListView就非常容易解决。

首先,定义布局文件 activity_main.xml

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <AutoCompleteTextView
        android:id="@+id/autoCompleteTextView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/multiAutoCompleteTextView1"
        android:layout_marginTop="54dp"
        android:ems="10"
         />

</RelativeLayout>

自定义下拉列表的list_item_for_autocomplete.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linear"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/code"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="股票代码" 
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="股票名称" 
        android:layout_weight="1"/>

    <Button
        android:id="@+id/button"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关注" 
        android:background="#000000"
        />
</LinearLayout>

自定义adapter.
package com.test.aotuedit;

import java.util.ArrayList;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

public class AutoCompleteAdapter extends BaseAdapter implements Filterable {

	//
	private Context context;
	private ArrayList<Map<String, Object>> or_arraylist ;// 原始数据
	private ArrayList<Map<String, Object>> new_arraylist;// 过滤后的数据
	private int maxMatch = 10;// 最大显示的数据条数
	private ArrayListFilter mFilter;
	private final Object mLock = new Object();
	private int count=0;

	// 构造器
	public AutoCompleteAdapter(Context context,
			ArrayList<Map<String, Object>> or_arraylist, int maxMatch) {
		// TODO Auto-generated constructor stub
		this.context = context;
		this.or_arraylist = or_arraylist;
		this.maxMatch = maxMatch;
		
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return new_arraylist.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return new_arraylist.get(arg0);
	}

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

	@Override
	public View getView(final int arg0, View arg1, ViewGroup arg2) {
		// TODO Auto-generated method stub
		ViewHolder holder = null;
		if (arg1 == null) {
			holder = new ViewHolder();
			LayoutInflater inflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			arg1 = inflater.inflate(R.layout.list_item_for_autocomplete, null);
			holder.code = (TextView) arg1.findViewById(R.id.code);
			holder.name = (TextView) arg1.findViewById(R.id.name);
			holder.button = (Button) arg1.findViewById(R.id.button);
			arg1.setTag(holder);
		} else {
			holder = (ViewHolder) arg1.getTag();
		}
		// 设置显示的内容
		holder.code.setText(new_arraylist.get(arg0).get("code").toString());
		holder.name.setText(new_arraylist.get(arg0).get("name").toString());
		if (new_arraylist.get(arg0).get("flag") instanceof Boolean) {
			boolean flag = (Boolean) new_arraylist.get(arg0).get("flag");
			if (flag == true) {
				holder.button.setText("已关注");
				holder.button.setClickable(false);
			} else {
				holder.button.setText("关注");
			}
		}
		holder.button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 此处需要更新数据库,新建进程更新数据库
				new_arraylist.get(arg0).put("flag", true);
				notifyDataSetChanged();
			}
		});
		return arg1;
	}

	@Override
	public Filter getFilter() {
		// TODO Auto-generated method stub
		if (mFilter == null) {
			mFilter = new ArrayListFilter();
		}
		return mFilter;
	}

	class ViewHolder {
		TextView code;
		TextView name;
		Button button;
	}

	public ArrayList<Map<String, Object>> getAllItems() {
		return or_arraylist;
	}
	
	// 新建的自定义的过滤器
	private class ArrayListFilter extends Filter {

		@Override
		protected FilterResults performFiltering(CharSequence prefix) {
			// TODO Auto-generated method stub
			FilterResults results = new FilterResults();
			if(or_arraylist==null){
				System.out.println("--->>>");
			}
			//如果没有输入,那么显示所有
			if (prefix == null || prefix.length() == 0) {
				synchronized (mLock) {
					ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>(
							or_arraylist);
					results.values = list;
					results.count = list.size();
					return results;
				}
			} else {
				 String prefixString = prefix.toString().toLowerCase();    
				    
	                final int count = or_arraylist.size();    
	    
	                final ArrayList<Map<String, Object>> newValues =new ArrayList<Map<String,Object>>(count);    
	    
	                for (int i = 0; i < count; i++) {  
	                    final String code = or_arraylist.get(i).get("code").toString();    
	                    final String codeText = code.toLowerCase(); 
	                    final String name = or_arraylist.get(i).get("name").toString();    
	                    final String nameText = name.toLowerCase(); 
	    
	                    if (codeText.contains(prefixString)||nameText.contains(prefixString)) {  //源码 ,匹配开头  
	                           newValues.add(or_arraylist.get(i));
	                           System.out.println("--->>>"+or_arraylist.get(i).get("code").toString()+prefixString+codeText);
	                    }                  
	                    if(maxMatch>0){//有数量限制    
	                        if(newValues.size()>maxMatch-1){//不要太多    
	                            break;    
	                        }    
	                    }    
	                }    
	    
	                results.values = newValues;    
	                results.count = newValues.size();    
	            }    
	            return results;  
		}

		@Override
		protected void publishResults(CharSequence arg0, FilterResults results) {
			// TODO Auto-generated method stub
			new_arraylist = (ArrayList<Map<String, Object>>) results.values;    
            if (results.count > 0) {    
                notifyDataSetChanged();    
            } else {    
                notifyDataSetInvalidated();    
            }  
		}

	}

}

活动

package com.test.aotuedit;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.AutoCompleteTextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		AutoCompleteTextView tv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
		AutoCompleteAdapter adapter=new AutoCompleteAdapter(getApplicationContext(), getdata(), 10);
		tv.setAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	public ArrayList<Map<String,Object>> getdata(){
		//读取数据库的原始资料
		int len=10;
		ArrayList<Map<String,Object>> list=new ArrayList<Map<String,Object>>(len);
		for(int i=0;i<len;i++){
			Map<String,Object>map=new HashMap<String, Object>();
			map.put("code", "000"+i);
			map.put("name", "股票"+i);
			Random rand = new Random();
			int number = rand.nextInt(30);
			if(number%4==0){
				map.put("flag",false );
			}
			else{
				map.put("flag", true);
			}
			list.add(map);
		}
		//返回显示的数据
		return list;
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值