如何在android中搜索数据库时自动完成textview

时间:2016-09-16 12:06:17

标签: android sqlite autocomplete

您好我是Android的新手,我正在尝试创建一个字典,但我无法在我的应用中获得autocompletetextview。在搜索数据库时,我需要在db中自动完成单词的自动填充。我在这里搜索了很多东西,但找不到任何东西,所以我真的需要一些专家的帮助。提前谢谢..

XML

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainSearch" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="#eee"
        android:gravity="center_vertical|center_horizontal"
        android:minHeight="80dp"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:textAlignment="center" >

        <EditText
            android:id="@+id/editText1"
            style="@style/EditText.Style"
            android:layout_width="0dip"
            android:layout_weight="3"
            android:layout_height="wrap_content"
            android:hint="@string/hint"
            android:inputType="text" >

        </EditText>

        <ImageView
            android:id="@+id/imageButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="1dip"
            android:src="@drawable/ic_search_white_48dp" />

    </LinearLayout>

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/relativeLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1" >

        <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/linearLayout1"
            android:background="#fff" >

            <LinearLayout
                android:id="@+id/resultsLayout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingTop="12dp" >

            </LinearLayout>

        </ScrollView>

    </RelativeLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:gravity="bottom|right"
        android:orientation="horizontal"
        android:padding="10dp" >

        <ImageView
            android:id="@+id/infoButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/infoiconround" />
     </LinearLayout>
</RelativeLayout>

JAVA

public class MainSearch extends Activity {
    private Button mBtnNew;
    private static final String TAG = "OLAM LOGGER in MAIN";

    ProgressDialog pDialog;
    LinearLayout resLayout;
    LinearLayout layout;

    LayoutParams params;
    PopupWindow popUp;

    ImageView logo;
    TextView appDesc;
    TextView appDescEn; 
    TextView aboutTitle;
    TextView olamAuthor;
    TextView just_a_new_line;
    TextView olamUrl;

    boolean click = true;

    EditText editText;

    Typeface tf;
    DatabaseHelper dbHelper;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_search);

        resLayout = (LinearLayout) findViewById(R.id.resultsLayout);
        tf  = Typeface.createFromAsset(getBaseContext().getAssets(),"Meera.ttf");
        dbHelper = new DatabaseHelper(this);        
        ImageView button = (ImageView) findViewById(R.id.imageButton);


        //Creating Olam database if not exist from DB file in Assets. 
        try {
            Log.v(TAG, "Copying the database");
            dbHelper.createDatabase();          
        }
        catch (IOException ioe) {
            Log.v(TAG, "Unable to create database");
        }

        //Opening the database for operation with search button
        try {
            dbHelper.openDatabase();

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    editText = (EditText) findViewById(R.id.editText1);
                    String searchString = editText.getText().toString();

                    if(searchString.trim().length() != 0 && !searchString.isEmpty()) {
                        resLayout.removeAllViews();                 
                        new doSearch().execute();
                    }
                }
            });


        }
        catch (SQLiteException sqle) {
            throw sqle;
        }   

        //Opening the database for operation with keyboard GO button
        try {
            dbHelper.openDatabase();
            editText = (EditText) findViewById(R.id.editText1);
            editText.setOnEditorActionListener(new OnEditorActionListener() {        
                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    if(actionId==EditorInfo.IME_ACTION_DONE){
                        //do something
                        String searchString = editText.getText().toString();

                        if(searchString.trim().length() != 0 && !searchString.isEmpty()) {
                            resLayout.removeAllViews();                 
                            new doSearch().execute();
                        }
                    }
                return false;
                }
            });
        }
        catch (SQLiteException sqle) {
            throw sqle;
        }


        // About info popup 
        layout = new LinearLayout(this);
        logo = new ImageView(this);
        popUp = new PopupWindow(this);
        aboutTitle = new TextView(this);
        appDesc = new TextView(this);
        appDescEn = new TextView(this);
        olamAuthor = new TextView(this);
        just_a_new_line = new TextView(this);
        olamUrl = new TextView(this);

        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setBackgroundColor(Color.WHITE);

        aboutTitle.setText(R.string.title);        
        aboutTitle.setTextSize(30);
        aboutTitle.setTypeface(tf,Typeface.BOLD);        
        aboutTitle.setGravity(Gravity.CENTER_HORIZONTAL);

        appDesc.setText(R.string.app_description);        
        appDesc.setTextSize(TypedValue.COMPLEX_UNIT_DIP,20);
        appDesc.setTypeface(tf);        
        appDesc.setGravity(Gravity.CENTER_HORIZONTAL);

        appDescEn.setText(R.string.app_description_english);        
        appDescEn.setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
        appDescEn.setGravity(Gravity.CENTER_HORIZONTAL);

        olamAuthor.setText(Html.fromHtml(getResources().getString(R.string.olam_author)));        
        olamAuthor.setTextSize(11);                
        olamAuthor.setMovementMethod(LinkMovementMethod.getInstance());
        olamAuthor.setGravity(Gravity.CENTER_HORIZONTAL);

        just_a_new_line.setText(R.string.just_a_new_line);        
        just_a_new_line.setTextSize(10);                
        just_a_new_line.setMovementMethod(LinkMovementMethod.getInstance());
        just_a_new_line.setGravity(Gravity.LEFT);

        olamUrl.setText(Html.fromHtml(getResources().getString(R.string.olam_url)));        
        olamUrl.setTextSize(13);        
        olamUrl.setMovementMethod(LinkMovementMethod.getInstance());
        olamUrl.setGravity(Gravity.CENTER_HORIZONTAL);

        layout.addView(aboutTitle);
        layout.addView(appDesc);
        layout.addView(appDescEn);
        layout.addView(olamAuthor);
        layout.addView(just_a_new_line);
        layout.addView(olamUrl);
        layout.setBackgroundResource(drawable.popupbox);

        popUp.setBackgroundDrawable(new BitmapDrawable());        
        popUp.setOutsideTouchable(true);       
        popUp.setContentView(layout);

        ImageView infoButton = (ImageView) findViewById(R.id.infoButton);
        infoButton.setOnClickListener(new View.OnClickListener() {      
            @Override
            public void onClick(View v) {
                if(click){
                    popUp.showAtLocation(v, Gravity.CENTER, 10, 10);
                    popUp.update(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                    click = false;
                }
                else {
                    popUp.dismiss();
                    click = true;
                }

            }
        });

        //about window end

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Override back button
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (popUp.isShowing()) {
                popUp.dismiss();
                return false;
            }
        }
        return super.onKeyDown(keyCode, event);
    } 

    //searching done as an async task

    class doSearch extends AsyncTask<String, String, String> {

        String searchString;
        Map<String, String> matches;
        Map<String, ArrayList<Map<String, String>>> results = new HashMap<String, ArrayList<Map<String, String>>>();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainSearch.this);
            pDialog.setMessage(Html.fromHtml("<b>I am looking...........</b>"));
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            EditText editText = (EditText) findViewById(R.id.editText1);
            searchString = editText.getText().toString();

            //Logic for cancelling out apostrophe from entered query.
            if (searchString.contains("'")) {

                /*
                 temp is a StringBuilder used to store searchString after filtering out
                 apostrophe.
                 */
                StringBuilder temp = new StringBuilder();
                for (char c : searchString.toCharArray()) {
                    if (c != '\'')
                        temp.append(c);
                }
                searchString = temp.toString();
                if (searchString.trim().equals(""))
                    searchString = ":";
            }

            Log.v(TAG, searchString);
            if(searchString != null && !searchString.isEmpty()) {               
                Stemmer stem = new Stemmer();               
                String stems = stem.completeStem(searchString.toLowerCase());
                Log.v("Stemmer Tag", stems);                
                matches = dbHelper.getSimilarStems(stems);              

                // 
                if(!matches.isEmpty()) {

                    String[] resultIDs = new String[matches.size()];
                    int i=0;

                    for (Map.Entry<String, String> entry : matches.entrySet()) {                        
                            String resultID = entry.getKey();
                            String word = entry.getValue();                     
                            resultIDs[i] = resultID;
                            i++;                            
                    }

                    results = dbHelper.getDefinitions(resultIDs);    

                    Log.v("List Map Tag", "List Map created");

                    //results = dbHelper.searchDatabase(stems);             
                    Log.v(TAG, "Search Results Got back");              
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(String file_url) {
            pDialog.dismiss();      
            Log.v(TAG, "Dismissed Progress Dialog");
            renderResults();
        }

        protected void renderResults(){

            int i=1;

            if(matches.isEmpty()) {
                TextView sorryMsg = new TextView(MainSearch.this);
                TextView addUrl = new TextView(MainSearch.this);

                sorryMsg.setText(R.string.sorry_not_found);
                sorryMsg.setPadding(30, 15, 30, 0);
                sorryMsg.setGravity(Gravity.CENTER);
                sorryMsg.setTypeface(tf, Typeface.BOLD);
                sorryMsg.setTextSize(18);
                resLayout.addView(sorryMsg);

                addUrl.setText(Html.fromHtml(""));
                addUrl.setPadding(30, 15, 30, 0);
                addUrl.setGravity(Gravity.CENTER);
                addUrl.setTypeface(null, Typeface.BOLD);
                addUrl.setTextSize(18);
                addUrl.setMovementMethod(LinkMovementMethod.getInstance());
                resLayout.addView(addUrl);
            }
            else {

                    for (Map.Entry<String, String> entry : matches.entrySet()) {                    
                        String wordID = entry.getKey();
                        String word = entry.getValue();

                        TextView title = new TextView(MainSearch.this);         
                        title.setText(i+". "+word);         
                        title.setPadding(50, 20, 0, 0);
                        title.setTextSize(16);          
                        title.setTypeface(null, Typeface.BOLD);
                        resLayout.addView(title);
                        i++;
                        int nounFlag = 0;     
                        int verbFlag = 0;
                        int adjFlag = 0;

                        ArrayList<Map<String, String>> res = results.get(wordID);                       

                        for(Map<String,String> mapIt : res) {


                            LinearLayout nounLayout;
                                nounLayout = new LinearLayout(MainSearch.this);
                                nounLayout.setOrientation(LinearLayout.VERTICAL);
                                nounLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

                            LinearLayout verbLayout;
                                verbLayout = new LinearLayout(MainSearch.this);                                 
                                verbLayout.setOrientation(LinearLayout.VERTICAL);
                                verbLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

                            LinearLayout adjLayout;
                                adjLayout = new LinearLayout(MainSearch.this);                                  
                                adjLayout.setOrientation(LinearLayout.VERTICAL);
                                adjLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

                            LinearLayout generalLayout;
                                generalLayout = new LinearLayout(MainSearch.this);                                  
                                generalLayout.setOrientation(LinearLayout.VERTICAL);
                                generalLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

                            for (Map.Entry<String, String> resultMap : mapIt.entrySet()) {
                                String meaning = resultMap.getKey();
                                String type = resultMap.getValue(); 



                                if(type.equals("n")) //if equals a noun
                                {
                                    Log.v(TAG, "Noun");
                                    TextView temp = new TextView(MainSearch.this);
                                    if(nounFlag==0) {                       

                                        TextView typeView = new TextView(MainSearch.this);
                                        typeView.setText(R.string.noun);
                                        typeView.setTypeface(tf, Typeface.ITALIC);
                                        typeView.setTextSize(15);
                                        typeView.setTextColor(Color.GRAY);
                                        typeView.setPadding(90, 15, 15, 0);
                                        nounLayout.addView(typeView);

                                        meaning = meaning;
                                        temp.setText(meaning);
                                        typeView.setTextColor(Color.RED);
                                        temp.setPadding(100, 15, 15, 0);                                        
                                        temp.setTypeface(tf);
                                        temp.setTextSize(19);
                                        nounLayout.addView(temp);
                                        nounFlag=1;
                                    }
                                    else {
                                        meaning = " "+meaning;
                                        temp.setText(meaning);
                                        temp.setPadding(100, 15, 15, 0);                                        
                                        temp.setTypeface(tf);
                                        temp.setTextSize(19);
                                        nounLayout.addView(temp);
                                    }
                                }
                                else if(type.equals("v")) //if equals a verb
                                {
                                    Log.v(TAG,"Verb");      
                                    TextView temp = new TextView(MainSearch.this);

                                    if(verbFlag==0) {
                                        TextView typeView = new TextView(MainSearch.this);
                                        typeView.setText(R.string.verb);
                                        typeView.setTypeface(tf, Typeface.ITALIC);
                                        typeView.setTextColor(Color.GRAY);
                                        typeView.setTextSize(15);
                                        typeView.setPadding(90, 15, 15, 0);
                                        verbLayout.addView(typeView);

                                        meaning = ""+meaning;
                                        temp.setText(meaning);
                                        temp.setPadding(100, 15, 15, 0);                                        
                                        temp.setTypeface(tf);
                                        temp.setTextSize(19);
                                        verbLayout.addView(temp);
                                        verbFlag=1;
                                    }
                                    else {
                                        meaning = ""+meaning;
                                        temp.setText(meaning);
                                        temp.setPadding(100, 15, 15, 0);                                        
                                        temp.setTypeface(tf);
                                        temp.setTextSize(19);
                                        verbLayout.addView(temp);
                                    }
                                }
                                else if(type.equals("a")) //if equals an adjective
                                {
                                    Log.v(TAG,"Adjective");     
                                    TextView temp = new TextView(MainSearch.this);

                                    if(adjFlag==0) {
                                        TextView typeView = new TextView(MainSearch.this);
                                        typeView.setText(R.string.adjective);
                                        typeView.setTypeface(tf, Typeface.ITALIC);
                                        typeView.setTextColor(Color.GRAY);
                                        typeView.setTextSize(15);
                                        typeView.setPadding(90, 15, 15, 0);
                                        adjLayout.addView(typeView);

                                        meaning = meaning;
                                        temp.setText(meaning);
                                        temp.setPadding(100, 15, 15, 0);                                        
                                        temp.setTypeface(tf);
                                        temp.setTextSize(19);
                                        adjLayout.addView(temp);
                                        adjFlag=1;
                                    }
                                    else {
                                        meaning = meaning;
                                        temp.setText(meaning);
                                        temp.setPadding(100, 15, 15, 0);                                        
                                        temp.setTypeface(tf);
                                        temp.setTextSize(19);
                                        adjLayout.addView(temp);
                                    }
                                } 
                                else { //if equals everything else
                                    TextView temp = new TextView(MainSearch.this);
                                    meaning = meaning;
                                    temp.setText(meaning);
                                    temp.setPadding(100, 15, 15, 0);                                        
                                    temp.setTypeface(tf);
                                    temp.setTextSize(19);
                                    generalLayout.addView(temp);
                                }

                                resLayout.addView(nounLayout);
                                resLayout.addView(verbLayout);
                                resLayout.addView(adjLayout);
                                resLayout.addView(generalLayout);


                            }


                        }
                    }

            }

        }
    }

}

1 个答案:

答案 0 :(得分:0)

尝试这种方式它会对你有用

public class MainActivity extends Activity {


    CustomAutoCompleteView myAutoComplete;

    // adapter for auto-complete
    ArrayAdapter<String> myAdapter;

    // for database operations
    DatabaseHandler databaseH;

    // just to add some initial value
    String[] item = new String[] {"Please search..."};

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try{

            // instantiate database handler
            databaseH = new DatabaseHandler(MainActivity.this);

            // put sample data to database
            insertSampleData();

            // autocompletetextview is in activity_main.xml
            myAutoComplete = (CustomAutoCompleteView) findViewById(R.id.myautocomplete);

            // add the listener so it will tries to suggest while the user types
            myAutoComplete.addTextChangedListener(new CustomAutoCompleteTextChangedListener(this));

            // set our adapter
            myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, item);
            myAutoComplete.setAdapter(myAdapter);

        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void insertSampleData(){

        // CREATE
        databaseH.create( new MyObject("January") );
        databaseH.create( new MyObject("February") ); 
        databaseH.create( new MyObject("March") );
        databaseH.create( new MyObject("April") );
        databaseH.create( new MyObject("May") );
        databaseH.create( new MyObject("June") );
        databaseH.create( new MyObject("July") );
        databaseH.create( new MyObject("August") );
        databaseH.create( new MyObject("September") );
        databaseH.create( new MyObject("October") );
        databaseH.create( new MyObject("November") );
        databaseH.create( new MyObject("December") );
        databaseH.create( new MyObject("New Caledonia") ); 
        databaseH.create( new MyObject("New Zealand") );
        databaseH.create( new MyObject("Papua New Guinea") );
        databaseH.create( new MyObject("COFFEE-1K") );
        databaseH.create( new MyObject("coffee raw") );
        databaseH.create( new MyObject("authentic COFFEE") );
        databaseH.create( new MyObject("k12-coffee") );
        databaseH.create( new MyObject("view coffee") );
        databaseH.create( new MyObject("Indian-coffee-two") );

    }

    // this function is used in CustomAutoCompleteTextChangedListener.java
    public String[] getItemsFromDb(String searchTerm){

        // add items on the array dynamically
        List<MyObject> products = databaseH.read(searchTerm);
        int rowCount = products.size();

        String[] item = new String[rowCount];
        int x = 0;

        for (MyObject record : products) {

            item[x] = record.objectName;
            x++;
        }

        return item;
    }

}

https://www.codeofaninja.com/2013/11/android-autocompletetextview-example-sqlite-database.html

http://sampleprogramz.com/android/autocompletetextview.php