От автозаполнения текстового поля до поиска в базе данных и отображения? - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть это маленькое «приложение», и я хочу, чтобы, когда кто-то печатал в текстовом поле «Автозаполнение», например «Новый», он автоматически отображал «Нью-Йорк» в качестве параметра, и это (функция автозаполнения) работает нормально. Но я хочу, чтобы при вводе пользователем полного местоположения (или автозаполнение делало это для него) - этот текст (местоположение) вводится для поиска в базе данных, который затем просматривает базу данных и «собирает» все строки с указанным пользователем местоположением. Например, если пользователь введет «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>

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Я нашел решение, но не для 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));
}
1 голос
/ 02 декабря 2013

Я нашел решение для автозаполнения с отображением списка: *

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;
    }

Спасибо! Надеюсь, это сработает.

0 голосов
/ 28 апреля 2017

autocompletetextview

самый простой метод, который я использовал, вот он: ..

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...