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