android EditText+ListView的组合(类似于AutoCompleteTextView)
很好的帖子:
eoeWiki客户端(android版)1.0.0版正式发布~
http://www.eoeandroid.com/thread-194188-1-1.html
Android定时自动启动应用程序应用教程
http://www.eoeandroid.com/thread-194271-1-1.html
基于Android 随手记
http://www.eoeandroid.com/thread-194031-1-1.html
因为问这个问题的人很多,所以刚刚找了下代码,结果还手动的把他提取出来。好了废话不多说了。直接上代码。
package ki.test.edit_list; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; public class DBManager { private final int BUFFER_SIZE = 40000; public static final String DB_NAME = "city.db"; // 保存的数据库文件名 public static final String PACKAGE_NAME = "ki.test.edit_list"; public static final String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath() + "/" + PACKAGE_NAME; // 在手机里存放数据库的位置 private SQLiteDatabase database; private Context context; public DBManager(Context context) { this.context = context; } SQLiteDatabase db = null; public SQLiteDatabase getDatabase(){ try { openDatabase(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return db; } private void openDatabase() throws IOException { String dbfile = DB_PATH + "/" + DB_NAME; if (!(new File(dbfile).exists())) {// 判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库 InputStream is = this.context.getResources().openRawResource( R.raw.city); // 欲导入的数据库 FileOutputStream fos = new FileOutputStream(dbfile); byte[] buffer = new byte[BUFFER_SIZE]; int count = 0; while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); } db = SQLiteDatabase.openDatabase(dbfile, null, SQLiteDatabase.OPEN_READWRITE); } public void closeDatabase() { this.database.close(); } }
package ki.test.edit_list; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.*; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; public class SearchCity extends Activity implements OnItemClickListener, TextWatcher { public static List<Map<String, String>> City_Lists = new ArrayList<Map<String, String>>(); private List<Map<String, String>> defaultLists = new ArrayList<Map<String, String>>(); private List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); private final String NAME = "name"; private final String PARENT_NAME = "parent_name"; // sql 语句 private final String sql_Head = "select b.name , a.name from city a inner join (select _id ,name from city) b on a.parent_id = b._id where dtype = 'area' and a.name like '"; private String str_Sql = ""; private final String sql_Foot = "%'"; private EditText edit_search_city; private SQLiteDatabase db; private Cursor result; private SearchCity city = this; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.search); initControl(); initDefaultLists(); listView.setOnItemClickListener(this); edit_search_city.addTextChangedListener(this); } void initControl() { edit_search_city = (EditText) findViewById(R.id.edit_search); listView = (ListView) findViewById(R.id.listview); } private void initDefaultLists() { Map<String, String> map = new HashMap<String, String>(); map.put(NAME, getString(R.string.nocity)); defaultLists.add(map); } public boolean getLists(String edit_content) { str_Sql = sql_Head + edit_content + sql_Foot; db = new DBManager(city).getDatabase(); result = db.rawQuery(str_Sql, null); if (result.moveToFirst()) { while (!result.isAfterLast()) { Map<String, String> map = new HashMap<String, String>(); String name = result.getString(1); String parent_name = result.getString(0); if (name.equals(parent_name)) parent_name = ""; map.put(NAME, name); map.put(PARENT_NAME, parent_name); lists.add(map); result.moveToNext(); } City_Lists = lists; result.close(); db.close(); return true; } db.close(); return false; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String put_Content = City_Lists.get(position).get(NAME); Toast.makeText(getApplicationContext(), put_Content, 8000).show(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { lists.clear(); String edit_content = edit_search_city.getText().toString(); if (edit_content.equals("")) { return; } List<Map<String, String>> dataLists = null; dataLists = getLists(edit_content) ? lists : defaultLists; ListAdapter adapter = new SimpleAdapter(city, dataLists, R.layout.listview, new String[] { NAME, PARENT_NAME }, new int[] { R.id.txt_list_1, R.id.txt_list_2 }); listView.setAdapter(adapter); } @Override public void afterTextChanged(Editable s) { } }
package ki.test.edit_list; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class TestDemoActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startActivity(new Intent(getApplicationContext(), SearchCity.class)); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="55px" android:orientation="horizontal" > <TextView android:id="@+id/txt_list_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8px" android:layout_marginRight="10px" android:textColor="#FFFFFF" android:textSize="30px" /> <TextView android:layout_width="20px" android:layout_height="wrap_content" android:layout_marginRight="5px" android:text="--" android:textSize="20px" /> <TextView android:id="@+id/txt_list_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25px" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="400px" android:layout_height="500px" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="2px" android:background="#CCCCCC" android:layout_marginBottom="5px" /> <EditText android:id="@+id/edit_search" android:layout_width="350px" android:layout_height="wrap_content" android:hint="Enter the city"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="2px" android:background="#CCCCCC" android:layout_marginBottom="5px" /> <LinearLayout android:id="@+id/linear_list" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listview" android:layout_width="wrap_content" android:layout_height="wrap_content"></ListView> </LinearLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, TestDemoActivity!</string> <string name="app_name">设置城市</string> <string name="nocity">没有找到你想查询的城市</string> </resources>
其中由于是刚刚急着赶出来的 所以可能代码有些乱,但是主要看思路,另外我把源码 也上传了下。有不足地方请见晾。
源码下载:TestDemo.rar