android AutoCompleteTextView 自定义BaseAdapter

java哥 阅读:662 2021-03-31 23:31:16 评论:0


最近项目中需要做搜索功能,实现类似 Google、Baidu 搜索的 下拉提示效果。android为我们提供了 AutoCompleteTextView 控件来完成此功能。

网上好多例子都是简单使用 ArrayAdapter 来实现的,界面比较简单,实际项目中用处不大;自己研究了一番,自定义Adapter 继承BaseAdapter 并实现Filterable 接口 实现了上述功能。


效果截图:


相关源代码:

package com.activity.gdbk; 
 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 
 
import com.activity.gdbk.PageActivity.PageAdapter; 
import com.gdbk.dao.Bank; 
 
import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.os.Vibrator; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.AutoCompleteTextView; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.DatePicker; 
import android.widget.EditText; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TextView; 
 
//Android ListVew 点击item 显示隐匿菜单项 
public class ListActivity extends Activity implements OnItemClickListener, 
		OnItemLongClickListener { 
	// 自定义相关组件 
	private ListView listview; 
	private MyAdapter adapter; 
	// activity 数据源 
	private List<String> data; 
 
	// activity 标量 
	private int currentPosition = -1; 
	// activity 界面常量 
	private static final int DATE_DIALOG_ID = 1; 
	private static final int SHOW_DATAPICK = 0; 
	// 日期数据变量 
	private int mYear; 
	private int mMonth; 
	private int mDay; 
 
	// ListActivity 相关组件 
	private EditText time;// 查询时间 
	private AutoCompleteTextView address; 
 
	// 添加AutoComplements 适配器 
	public AutoAdapter autoadapter; 
	// 添加AutoComplements 数据源 
	List<Bank> banks = new ArrayList<Bank>(); 
 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		// TODO Auto-generated method stub 
		super.onCreate(savedInstanceState); 
		// 全屏模式 
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
				WindowManager.LayoutParams.FLAG_FULLSCREEN); 
		this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
		setContentView(R.layout.activity_listview); 
		initializeAdapter(); 
		initView(); 
		setData(); 
	} 
 
	// 自定义相关方法 
	private void initView() { 
		// 组件实例化 
		listview = (ListView) findViewById(R.id.listview); 
		time = (EditText) findViewById(R.id.data); 
		address = (AutoCompleteTextView) findViewById(R.id.address); 
		address.setAdapter(autoadapter); 
		address.setThreshold(1); // 设置输入一个字符 提示,默认为2 
		// 设置相关监听事件 
		address.setOnItemClickListener(new OnItemClickListener() { 
			@Override 
			public void onItemClick(AdapterView<?> arg0, View view, 
					int position, long id) { 
				// TODO Auto-generated method stub 
				Bank pc = banks.get(position); 
				address.setText(pc.getBank_name()); 
			} 
 
		}); 
		// 默认日期 
		setDateTime(); 
 
		// 设置相关监听事件 
		listview.setOnItemClickListener(this); 
		listview.setOnItemLongClickListener(this); 
 
		time.setOnClickListener(new DateButtonOnClickListener()); 
	} 
 
	private void setDateTime() { 
		final Calendar c = Calendar.getInstance(); 
		mYear = c.get(Calendar.YEAR); 
		mMonth = c.get(Calendar.MONTH); 
		mDay = c.get(Calendar.DAY_OF_MONTH); 
		updateDisplay(); 
	} 
 
	// adapter初始化方法----initializeAdapter() 
	public void initializeAdapter() { 
 
		for (int i = 1; i <= 10; i++) { 
			Bank items = new Bank(); 
			items.setBank_name("湖南省光大银行**支行" + i); 
			banks.add(items); 
		} 
		autoadapter = new AutoAdapter(ListActivity.this, banks); 
	} 
 
	/** 
	 * 更新日期 
	 */ 
	private void updateDisplay() { 
		time.setText(new StringBuilder().append(mYear).append("--") 
				.append((mMonth + 1) < 10 ? "0" + (mMonth + 1) : (mMonth + 1)) 
				.append("--").append((mDay < 10) ? "0" + mDay : mDay)); 
	} 
 
	// 设置相关静态数据 
	private void setData() { 
		data = new ArrayList<String>(); 
		for (int i = 0; i < 10; i++) { 
			data.add("员工姓名" + i); 
		} 
		if (adapter == null) { 
			adapter = new MyAdapter(this, data); 
			listview.setAdapter(adapter); 
		} else { 
			adapter.notifyDataSetChanged(); 
		} 
	} 
 
	@Override 
	protected void onResume() { 
		updateNoteBookList(); 
		super.onResume(); 
	} 
 
	private void updateNoteBookList() { 
		if (adapter != null) { 
			setData(); 
			adapter.notifyDataSetChanged(); 
		} 
	} 
 
	// 覆写相关方法 
	@Override 
	public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
			int position, long arg3) { 
		// TODO Auto-generated method stub 
		Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
		vibrator.vibrate(40); 
		currentPosition = position; 
		adapter.notifyDataSetChanged(); 
		return true; 
	} 
 
	@Override 
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
		// TODO Auto-generated method stub 
		currentPosition = -1; 
		adapter.notifyDataSetChanged(); 
	} 
 
	// 内部类---自定义适配器 
	public class MyAdapter extends BaseAdapter { 
		private Context context; 
		private LayoutInflater inflater; 
		private List<String> fileTypeList; 
 
		// 适配器构造函数 
		public MyAdapter(Context context, List<String> fileTypeList) { 
			this.context = context; 
			this.fileTypeList = fileTypeList; 
			inflater = LayoutInflater.from(context); 
		} 
 
		@Override 
		public int getCount() { 
			// TODO Auto-generated method stub 
			return fileTypeList.size(); 
		} 
 
		@Override 
		public Object getItem(int arg0) { 
			// TODO Auto-generated method stub 
			return fileTypeList.get(arg0); 
		} 
 
		@Override 
		public long getItemId(int position) { 
			// TODO Auto-generated method stub 
			return position; 
		} 
 
		@Override 
		public View getView(int position, View convertView, ViewGroup parent) { 
			// TODO Auto-generated method stub 
			ViewHolder holder = null; 
			if (convertView == null) { 
				convertView = inflater.inflate(R.layout.listview_item, parent, 
						false); 
				holder = new ViewHolder(); 
				holder.fileNameText = (TextView) convertView 
						.findViewById(R.id.item_name); 
				holder.fileTimeText = (TextView) convertView 
						.findViewById(R.id.item_time); 
				holder.fileSizeText = (TextView) convertView 
						.findViewById(R.id.item_pm); 
				holder.linearLayout = (LinearLayout) convertView 
						.findViewById(R.id.layout_other); 
				holder.openLinearLayout = (LinearLayout) convertView 
						.findViewById(R.id.item_open); 
				holder.editLinearLayout = (LinearLayout) convertView 
						.findViewById(R.id.item_edit); 
				holder.moveLinearLayout = (LinearLayout) convertView 
						.findViewById(R.id.item_move); 
				holder.deleteLinearLayout = (LinearLayout) convertView 
						.findViewById(R.id.item_delete); 
				convertView.setTag(holder); 
			} else { 
				holder = (ViewHolder) convertView.getTag(); 
			} 
			// 填充相关数据信息 
			String strs = fileTypeList.get(position); 
			holder.fileNameText.setText(strs); 
			holder.fileTimeText.setText(""); 
			holder.fileSizeText.setText(""); 
 
			// item 显示隐藏菜单 
			if (position == currentPosition) { 
				holder.linearLayout.setVisibility(View.VISIBLE); 
				holder.openLinearLayout.setClickable(true); 
				holder.editLinearLayout.setClickable(true); 
				holder.moveLinearLayout.setClickable(true); 
				holder.deleteLinearLayout.setClickable(true); 
				holder.openLinearLayout 
						.setOnClickListener(new OnClickListener() { 
 
							@Override 
							public void onClick(View v) { 
								// 饼状图页面 
 
								Intent pie = new Intent(ListActivity.this, 
										PieActivity.class); 
								startActivity(pie); 
							} 
						}); 
				holder.editLinearLayout 
						.setOnClickListener(new OnClickListener() { 
 
							@Override 
							public void onClick(View v) { 
								// TODO Auto-generated method stub 
								// 柱状图页面 
 
								Intent intent = new Intent(ListActivity.this, 
										BarActivity.class); 
								startActivity(intent); 
 
							} 
						}); 
				holder.moveLinearLayout 
						.setOnClickListener(new OnClickListener() { 
 
							@Override 
							public void onClick(View v) { 
								// 散点图页面 
 
								Intent scatter = new Intent(ListActivity.this, 
										ScatterAtivity.class); 
								startActivity(scatter); 
 
							} 
						}); 
				holder.deleteLinearLayout 
						.setOnClickListener(new OnClickListener() { 
 
							@Override 
							public void onClick(View v) { 
								// TODO Auto-generated method stub 
								// //折线图页面 
 
								Intent linear = new Intent(ListActivity.this, 
										LinearActivity.class); 
								startActivity(linear); 
 
							} 
						}); 
			} else { 
				holder.linearLayout.setVisibility(View.GONE); 
				holder.openLinearLayout.setClickable(false); 
				holder.editLinearLayout.setClickable(false); 
				holder.moveLinearLayout.setClickable(false); 
				holder.deleteLinearLayout.setClickable(false); 
			} 
 
			return convertView; 
		} 
 
	} 
 
	// 内部类-----自定义组件 
 
	public class ViewHolder { 
		public TextView fileNameText; 
		public TextView fileTimeText; 
		public TextView fileSizeText; 
		public LinearLayout linearLayout; 
		public LinearLayout openLinearLayout; 
		public LinearLayout editLinearLayout; 
		public LinearLayout moveLinearLayout; 
		public LinearLayout deleteLinearLayout; 
 
	} 
 
	// 自定义 监听事件 
	/** 
	 * 选择日期Button的事件处理 
	 *  
	 * @author Raul 
	 *  
	 */ 
 
	class DateButtonOnClickListener implements 
 
	android.view.View.OnClickListener { 
 
		@Override 
		public void onClick(View v) { 
 
			Message msg = new Message(); 
 
			if (time.equals((EditText) v)) { 
 
				msg.what = ListActivity.SHOW_DATAPICK; 
 
			} 
 
			ListActivity.this.saleHandler.sendMessage(msg); 
 
		} 
 
	} 
 
	// ListActivity 主线程 
	/** 
	 * 处理日期控件的Handler 
	 */ 
 
	Handler saleHandler = new Handler() { 
		@Override 
		public void handleMessage(Message msg) { 
			switch (msg.what) { 
			case ListActivity.SHOW_DATAPICK: 
				showDialog(DATE_DIALOG_ID); 
				break; 
			} 
		} 
	}; 
 
	/** 
	 * 日期控件的事件 
	 */ 
 
	private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
		public void onDateSet(DatePicker view, int year, int monthOfYear, 
				int dayOfMonth) { 
			mYear = year; 
			mMonth = monthOfYear; 
			mDay = dayOfMonth; 
			updateDisplay(); 
 
		} 
 
	}; 
 
	@Override 
	protected Dialog onCreateDialog(int id) { 
		switch (id) { 
		case DATE_DIALOG_ID: 
			return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, 
					mDay); 
 
		} 
		return null; 
	} 
 
	@Override 
	protected void onPrepareDialog(int id, Dialog dialog) { 
		switch (id) { 
		case DATE_DIALOG_ID: 
			((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay); 
			break; 
		} 
	} 
 
	// 自定义AutoComplement 文本的数据适配器 
	public class AutoAdapter extends BaseAdapter implements Filterable { 
		private Context autocontext; 
		private LayoutInflater autoinflater; 
		private List<Bank> autobanks; 
		private ArrayList<Bank> autobank; 
 
		// 自定义内部类 
		private ArrayFilter mFilter; 
 
		// AutoAdapter构造函数 
		public AutoAdapter(Context autocontext, List<Bank> autobanks) { 
			this.autocontext = autocontext; 
			this.autobanks = autobanks; 
			autoinflater = LayoutInflater.from(autocontext); 
 
		} 
 
		@Override 
		public int getCount() { 
			// TODO Auto-generated method stub 
			return autobanks.size(); 
		} 
 
		@Override 
		public Object getItem(int position) { 
			// TODO Auto-generated method stub 
			return autobanks.get(position); 
		} 
 
		@Override 
		public long getItemId(int position) { 
			// TODO Auto-generated method stub 
			return position; 
		} 
 
		@Override 
		public View getView(int position, View convertView, ViewGroup parent) { 
			// TODO Auto-generated method stub 
			AutoViewHolder holder = null; 
			if (convertView == null) { 
				convertView = autoinflater.inflate(R.layout.listview_page_item, 
						parent, false); 
				holder = new AutoViewHolder(); 
				holder.autotextview = (TextView) convertView 
						.findViewById(R.id.content); 
				convertView.setTag(holder); 
			} else { 
				holder = (AutoViewHolder) convertView.getTag(); 
			} 
			holder.autotextview.setText(autobanks.get(position).getBank_name()); 
			return convertView; 
		} 
 
		// AutoAdapter适配器 的拦截器 
		// AutoComplements 配置拦截器 
		private class ArrayFilter extends Filter { 
			@Override 
			protected FilterResults performFiltering(CharSequence prefix) { 
				// TODO Auto-generated method stub 
				FilterResults results = new FilterResults(); 
				if (autobank == null) { 
					autobank = new ArrayList<Bank>(autobanks); 
				} 
 
				if (prefix == null || prefix.length() == 0) { 
					ArrayList<Bank> list = autobank; 
					results.values = list; 
					results.count = list.size(); 
				} else { 
					String prefixString = prefix.toString().toLowerCase(); 
					ArrayList<Bank> unfilteredValues = autobank; 
					int count = unfilteredValues.size(); 
 
					ArrayList<Bank> newValues = new ArrayList<Bank>(count); 
 
					for (int i = 0; i < count; i++) { 
						Bank pc = unfilteredValues.get(i); 
						if (pc != null) { 
							if (pc.getBank_name() != null 
									&& pc.getBank_name().startsWith( 
											prefixString)) { 
								newValues.add(pc); 
							} 
						} 
					} 
 
					results.values = newValues; 
					results.count = newValues.size(); 
 
				} 
 
				return results; 
			} 
 
			@Override 
			protected void publishResults(CharSequence constraint, 
					FilterResults results) { 
				// TODO Auto-generated method stub 
				autobanks = (List<Bank>) results.values; 
				if (results.count > 0) { 
					notifyDataSetChanged(); 
				} else { 
					notifyDataSetInvalidated(); 
				} 
 
			} 
 
		} 
 
		// 实现Filterable 接口需要覆写的相关方法 
		@Override 
		public Filter getFilter() { 
			// TODO Auto-generated method stub 
			if (mFilter == null) { 
				mFilter = new ArrayFilter(); 
			} 
			return mFilter; 
 
		} 
 
	} 
 
	// 自定义AutoComplement的布局类文件 
	public class AutoViewHolder { 
		private TextView autotextview; 
	} 
 
}

 相关样式文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
 
    <!-- 相关自定义控件 --> 
 
    <TextView 
        android:id="@+id/content" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" > 
    </TextView> 
 
</LinearLayout>



标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号