【问题标题】:From AutoComplete textbox to database search and display?从自动完成文本框到数据库搜索和显示?
【发布时间】:2011-02-11 09:58:42
【问题描述】:

我有这个小“应用程序”,我希望当有人在自动完成文本框中输入例如“新建”时,它会自动显示“纽约”作为选项,并且(自动完成功能)工作正常。但是我希望当用户输入完整位置(或自动完成为他输入)时 - 文本(位置)输入被转发到数据库搜索,然后搜索数据库并“收集”用户输入位置的所有行。例如,如果用户输入“New York”,数据库搜索将找到其中包含“New York”的所有行。当它找到一个/多个行时,它将在下面显示它们。在图像中...

当用户输入时我有这个...

http://www.imagesforme.com/show.php/1093305_SNAG0000.jpg

当用户选择自动完成位置时我有这个

http://www.imagesforme.com/show.php/1093306_SNAG0001.jpg

但是当用户选择自动完成位置时我想要这个

http://www.imagesforme.com/show.php/1093307_CopyofSNAG0001.jpg

完整代码

package com.svebee.prijevoz;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
public class ZelimDoci extends Activity {

TextView lista; 

static final String[] STANICE = new String[] {
   "New York", "Chicago", "Dallas", "Los Angeles"
 };

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.zelimdoci);

  AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, STANICE);
  textView.setAdapter(adapter);

  lista = (TextView)findViewById(R.id.lista);

  SQLiteDatabase myDB= null;
  String TableName = "Database";

  String Data="";

  /* Create a Database. */
  try {
   myDB = this.openOrCreateDatabase("Database", MODE_PRIVATE, null);

   /* Create a Table in the Database. */
   myDB.execSQL("CREATE TABLE IF NOT EXISTS "
     + TableName
     + " (Field1 INT(3) UNIQUE, Field2 INT(3) UNIQUE, Field3 VARCHAR UNIQUE, Field4 VARCHAR UNIQUE);"); 

   Cursor a = myDB.rawQuery("SELECT * FROM Database where Field1 == 1", null);
   a.moveToFirst();
   if (a == null) {   
   /* Insert data to a Table*/
   myDB.execSQL("INSERT INTO "
     + TableName
     + " (Field1, Field2, Field3, Field4)"
     + " VALUES (1, 119, 'New York', 'Dallas');");
   myDB.execSQL("INSERT INTO "
     + TableName
     + " (Field1, Field2, Field3, Field4)"
     + " VALUES (9, 587, 'California', 'New York');");
   }
   myDB.execSQL("INSERT INTO "
     + TableName
     + " (Field1, Field2, Field3, Field4)"
     + " VALUES (87, 57, 'Canada', 'London');");
   }

   /*retrieve data from database */
   Cursor c = myDB.rawQuery("SELECT * FROM " + TableName , null);

   int Column1 = c.getColumnIndex("Field1");
   int Column2 = c.getColumnIndex("Field2");
   int Column3 = c.getColumnIndex("Field3");
   int Column4 = c.getColumnIndex("Field4");

   // Check if our result was valid.
   c.moveToFirst();
   if (c != null) {
    // Loop through all Results
    do {
     String LocationA = c.getString(Column3);
     String LocationB = c.getString(Column4);
     int Id = c.getInt(Column1);
     int Linija = c.getInt(Column2);
     Data =Data +Id+" | "+Linija+" | "+LocationA+"-"+LocationB+"\n";
    }while(c.moveToNext());
   }
   lista.setText(String.valueOf(Data));
  }
  catch(Exception e) {
   Log.e("Error", "Error", e);
  } finally {
   if (myDB != null)
    myDB.close();
  }
 }
}

.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:textSize="20sp" android:gravity="center_horizontal" android:padding="10sp" android:text="Test AutoComplete"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:padding="5dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="AutoComplete" />
    <AutoCompleteTextView android:id="@+id/autocomplete_country"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"/>
</LinearLayout>

</LinearLayout>

【问题讨论】:

    标签: android textbox autocomplete


    【解决方案1】:

    我找到了解决方案,但没有找到 AutoCompleteTextBox - 但它非常接近,我会说以两种不同的方式解决了相同的问题(您可以使用 LIKE 参数化您的数据库调用%someText%' 基本上是 AutoCompleteTextBox)。解决方案是 - 只需添加

    addTextChangedListener
    

    在您的 EditText 上和上

    onTextChanged
    

    只需调用一些方法 refreshList() - 它将调用数据库并提取结果(当然还会在列表中显示它们)

        someTextView = (EditText) findViewById(R.id.someTextView);
        someTextView.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String enteredText = someTextView.getText().toString();
                refreshList(enteredText);
            }
        });
    

    这就是 refreshList() 的样子

    public void refreshList(String text) {
        items = SomeClassWithStaticMethods.getSomeData(text);
    
        list.setAdapter(new ArrayAdapter<String>(this, R.layout.single_row, R.id.singleRow, items));
    }
    

    【讨论】:

    • 你能问一下吗??谢谢!!
    【解决方案2】:

    我找到了自动完成的解决方案,列表视图显示如下:-

    namelist.xml

    <?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="fill_parent"
        android:orientation="vertical" >
    
    
        <AutoCompleteTextView 
            android:id="@+id/textView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="Search here"
    
            />
        <ListView
            android:id="@+id/listView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    SearchActivity.java

    public class SearchActivity  extends Activity {
        /** Called when the activity is first created. */
    
    
        ListView listView;
        List<String> listItems=new ArrayList<String>();
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.nameslist);
    //        editTextSearch=(EditText)findViewById(R.id.editTextSearch);
            listView=(ListView)findViewById(R.id.listView);
            refreshList("");
    
        }
    
        public void refreshList(String text) {
              listItems.clear(); 
              DatabaseHandler db = new DatabaseHandler(this);
              List<Contact> mContactList= db.getAllContactsBySearch("");
    
              for(int i=0;i<mContactList.size();i++)
              {
                  listItems.add(mContactList.get(i).getName());
              }
              ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,
                      android.R.layout.simple_dropdown_item_1line, listItems);
              AutoCompleteTextView textView = (AutoCompleteTextView)
                      findViewById(R.id.textView);
              textView.setAdapter(adapter);
        }
    
    }
    

    Databasehandler.java

    // Getting All Contacts
        public List<Contact> getAllContactsBySearch(String searchStr) {
            List<Contact> contactList = new ArrayList<Contact>();
            // Select All Query
            String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS + " where name  LIKE '%"+searchStr+"%'";
    
            SQLiteDatabase db = this.getWritableDatabase();
            try
            {
            Cursor cursor = db.rawQuery(selectQuery, null);
            // looping through all rows and adding to list
            if (cursor.moveToFirst()) {
                do {
                    Contact contact = new Contact();
                    contact.setID(Integer.parseInt(cursor.getString(0)));
                    contact.setName(cursor.getString(1));
                    contact.setPhoneNumber(cursor.getString(2));
                    // Adding contact to list
                    contactList.add(contact);
                } while (cursor.moveToNext());
            }
            }
            catch(Exception e)
            {
    
            }
    
    
            // return contact list
            return contactList;
        }
    

    谢谢!!我希望这会奏效。

    【讨论】:

      【解决方案3】:

      自动完成文本视图

      我在这里遵循的最简单的方法是..

      main.java

           DBController dbadpter= new DBController(this);
      
           private SQLiteDatabase db;
           ArrayAdapter<String> adapter ;
              ....
               super.onCreate(savedInstanceState);
              ...
           AutoCompleteTextView text=(AutoCompleteTextView) 
                                  findViewById(R.id.text);
      
           String[] srr=dbadpter.getplant();
           adapter = new ArrayAdapter<String>(this, R.layout.list_view, srr);
           text.setThreshold(1);
           text.setAdapter(adapter); 
      

      DBController.java

            public String[] getplant(){
          Cursor cursor = getReadableDatabase().rawQuery("SELECT DISTINCT YOURCOLUMNNAME FROM YOURTABLENAME", null);
          cursor.moveToFirst();
          ArrayList<String> text = new ArrayList<String>();
          while(!cursor.isAfterLast()) {
              text.add(cursor.getString(cursor.getColumnIndex("YOURCOLUMNNAME")));
              cursor.moveToNext();
          }
          cursor.close();
          return text.toArray(new String[text.size()]);
      }
      

      main.xml

               <AutoCompleteTextView 
          android:id="@+id/text"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:hint="Search here"
      
          />
      

      list_view.xml

                  <?xml version="1.0" encoding="utf-8"?>
                 <TextView 
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:padding="10dp"
                    android:textSize="16sp"
                    android:textColor="#000">
                       </TextView>
      

      【讨论】:

        猜你喜欢
        • 2018-02-05
        • 1970-01-01
        • 2021-09-09
        • 2017-10-22
        • 2017-05-19
        • 2016-08-09
        • 1970-01-01
        • 2015-09-02
        • 2012-03-20
        相关资源
        最近更新 更多