搜索历史现实用popwindow实现

该博客介绍了如何使用PopWindow来实现类似Spinner的搜索历史提示效果,提供了一种在不修改现有editText代码基础上为其添加提示的方案。示例代码中,弹出窗口宽度与editText匹配,若要调整为全屏,需修改PopWindow初始化参数。文章还提供了Demo下载链接。
摘要由CSDN通过智能技术生成

类似Spinner实现自动弹出提示的效果,通过popWindow实现,更个性化。

在不更改原有代码的基础上为editText轻松加上提示。


HistoryPopWindow.java

package com.example.edittexthistory;

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.preference.PreferenceManager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

/**
 * @author XieHao
 * 
 *         搜索历史弹出框
 */
public class HistoryPopWindow {

	/**
	 * Item项点击事件接口
	 * 
	 */
	public interface OnClickListener {
		public void onClick(String key);
	}

	public void setOnClickListener(OnClickListener clickListener) {
		this.clickListener = clickListener;
	}

	private OnClickListener clickListener;

	private Context context;
	private PopupWindow popupWindow;
	private ArrayList<String> datalist = new ArrayList<String>();

	private Button btnClear;
	private ListView listView;
	private HistoryAdapter adapter = new HistoryAdapter();

	private int limitSize = 5;// 存储数据上限
	private String SAVE_STATUS = "fuzzy_search";// 存储数据的标志位

	@SuppressLint("InflateParams")
	public HistoryPopWindow(final Context context) {
		this.context = context;
		LayoutInflater inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View mRootView = inflater.inflate(R.layout.search_history_window, null);

		btnClear = (Button) mRootView.findViewById(R.id.btn_clear);
		listView = (ListView) mRootView.findViewById(R.id.listView);

		datalist = loadArray();
		adapter.InitDate(datalist);
		listView.setAdapter(adapter);

		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				String key = String.valueOf(adapter.getItem(position));
				if (clickListener != null) {
					clickListener.onClick(key);
				}
				dismiss();
			}
		});

		btnClear.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				datalist.clear();
				saveArray(datalist);
				dismiss();
			}
		});

		popupWindow = new PopupWindow(mRootView, LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);

		popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		popupWindow.setOutsideTouchable(true); // 设置PopupWindow点击外部区域消失
	}

	/**
	 * 在父控件底部显示
	 * 
	 * @param parent
	 */
	public void ShowAtBottom(View parent) {
		if (datalist.size() == 0)
			return;
		int[] location = new int[2];
		parent.getLocationOnScreen(location);
		popupWindow.showAtLocation(parent, Gravity.NO_GRAVITY, location[0],
				location[1] + parent.getHeight());
	}

	/**
	 * 动态设置listView的宽度
	 * 
	 * @param width
	 */
	public void setListViewWidth(int width) {
		ViewGroup.LayoutParams params = listView.getLayoutParams();
		params.width = width;
		listView.setLayoutParams(params);
	}

	public void dismiss() {
		popupWindow.dismiss();
	}

	public boolean isShowing() {
		return popupWindow.isShowing();
	}

	/**
	 * 存储新的数据
	 * 
	 * @param key
	 */
	public void addNewKey(String key) {
		if (datalist == null) {
			datalist = new ArrayList<String>();
		}

		if (datalist.contains(key))
			datalist.remove(key);

		if (datalist.size() >= limitSize) {
			datalist.remove(0);
		}

		datalist.add(key);
		saveArray(datalist);
	}

	/**
	 * 用SharedPreferences存储列表
	 * 
	 * @param list
	 * @return
	 */
	public boolean saveArray(final ArrayList<String> list) {
		SharedPreferences pref = PreferenceManager
				.getDefaultSharedPreferences(context);
		SharedPreferences.Editor mEdit1 = pref.edit();

		int listSize = list.size();
		mEdit1.putInt(SAVE_STATUS + "_size", listSize);

		for (int i = 0; i < listSize; i++) {
			mEdit1.remove(SAVE_STATUS + "_" + i);
			mEdit1.putString(SAVE_STATUS + "_" + i, list.get(i));
		}

		return mEdit1.commit();
	}

	/**
	 * 从SharedPreferences取出列表数据
	 * 
	 * @return
	 */
	public ArrayList<String> loadArray() {
		SharedPreferences pref = PreferenceManager
				.getDefaultSharedPreferences(context);
		int size = pref.getInt(SAVE_STATUS + "_size", 0);

		datalist = new ArrayList<String>();
		for (int i = 0; i < size; i++) {
			datalist.add(pref.getString(SAVE_STATUS + "_" + i, null));
		}

		return datalist;
	}

	private class HistoryAdapter extends BaseAdapter {

		private ArrayList<String> datalist;

		public void InitDate(ArrayList<String> datalist) {
			this.datalist = datalist;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				LayoutInflater inflater = (LayoutInflater) context
						.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

				convertView = inflater.inflate(
						R.layout.search_history_window_item, parent, false);

				holder = new ViewHolder();
				holder.tvText = (TextView) convertView
						.findViewById(R.id.tv_text);

				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}

			holder.tvText.setText(datalist.get(datalist.size() - 1 - position));
			// 倒序显示,最近搜索的显示在最上方

			return convertView;
		}

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

		@Override
		public Object getItem(int position) {
			if (datalist != null)
				return datalist.get(datalist.size() - 1 - position);
			return null;
		}

		@Override
		public int getCount() {
			return datalist.size();
		}
	};

	public class ViewHolder {
		private TextView tvText;
	}

}

MainActivity.java

package com.example.edittexthistory;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

	private Context context;
	private EditText editText;
	private Button btnSearch;
	private HistoryPopWindow historyPopWindow;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;

		editText = (EditText) findViewById(R.id.editText);
		btnSearch = (Button) findViewById(R.id.btnSearch);

		editText.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				showSearchHistory(context, v);
			}
		});

		btnSearch.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				saveKeywords();
			}
		});
	}

	private void saveKeywords() {
		if (historyPopWindow == null)
			historyPopWindow = new HistoryPopWindow(context);
		String key = editText.getText().toString().trim();
		if (!key.equals(""))
			historyPopWindow.addNewKey(key);
	}

	private void showSearchHistory(Context context, View parent) {
		if (historyPopWindow == null)
			historyPopWindow = new HistoryPopWindow(context);
		historyPopWindow
				.setOnClickListener(new HistoryPopWindow.OnClickListener() {

					@Override
					public void onClick(String key) {
						editText.setText(key);
					}
				});
		historyPopWindow.setListViewWidth(editText.getWidth());
		historyPopWindow.ShowAtBottom(parent);
	}

}

demo的弹出框宽度与editText一致,如果想要改成充满布局需要更改new popouWindow时的参数。


Demo下载地址:http://download.csdn.net/detail/xiehao_95/9411772


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值