9

I'm using an AutoCompleteTextView to suggest user some words from my sqlite db as they type the input string to search.

I try to make the suggestion look friendly by using simple_list_item_2, here's my code:

package com.suit.kamus;

import android.app.Activity;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

public class SuitAuto extends Activity implements TextWatcher{
AutoCompleteTextView auto; TextView result;
Button search; Button add; Spinner chooser;
String input; static String selection; String main;
String[] options = {"en to ina", "ina to en"};
SimpleCursorAdapter simple;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    auto = (AutoCompleteTextView)findViewById(R.id.auto);
    auto.addTextChangedListener(this);

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

    chooser = (Spinner)findViewById(R.id.chooser);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, options);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    chooser.setAdapter(adapter);

    KamusDbAdapter dbHelper = new KamusDbAdapter(getApplicationContext());
    dbHelper.open();
    String status = dbHelper.getstatedb();
    selection = status;
    dbHelper.close();

    if (selection.equalsIgnoreCase("en")){
        chooser.setSelection(0);
    } else {chooser.setSelection(1);}

    Log.d("statelang", selection);

    add = (Button)findViewById(R.id.add);
    add.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            startAdding(main);
        }

    });

    chooser.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub
            if (chooser.getSelectedItemId() == 0){
                selection = "en";
                select();
                updateDb();
            }else{
                selection = "ina";
                select();
                updateDb();
            }
        }

        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

    auto.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub

            main = auto.getText().toString();
            //Log.v("CURSOR",finish);
            result.setText("");
            auto.setText("");
        }
    });


}

public void startAdding(String dWord) {
    // TODO Auto-generated method stub
    KamusDbAdapter adding = new KamusDbAdapter(getApplicationContext());
    adding.open();
    adding.Favorite(dWord);
    adding.close();
}

protected void updateDb() {
    // TODO Auto-generated method stub
    KamusDbAdapter save = new KamusDbAdapter(getApplicationContext());
    save.open();
    save.updatestatedb(selection);
    save.close();
}


public static String select() {
    // TODO Auto-generated method stub
    Log.v("STRING",selection);
    return selection;
}

@Override
public void afterTextChanged(Editable arg0) {
    // TODO Auto-generated method stub

}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
        int arg3) {
    // TODO Auto-generated method stub

}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    input = auto.getText().toString();

    KamusDbAdapter x = new KamusDbAdapter(getApplicationContext());
    x.open();
    Cursor cur = x.getCall(input, selection);
    //getCall is in KamusDbAdapter class, it used to return result cursor from sqlite db
    //i use rawQuery "SELECT * FROM en_to_ina WHERE word LIKE 'input%'"
    x.close();

    String[] displayFields = new String[] {"word", "meaning"};

    int[] displayViews = new int[] { android.R.id.text1,android.R.id.text2 };

    simple = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cur,displayFields, displayViews);

    auto.setAdapter(simple); 

}
}

I got a problem with retrieving the string from clicked item. It is in:

auto.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub

            main = auto.getText().toString();
            //Log.v("CURSOR",finish);
            result.setText("");
            auto.setText("");
        }
    });

I need both strings from word and meaning fields. Any response would be great...

General Grievance
  • 4,555
  • 31
  • 31
  • 45
BolbazarMarme
  • 1,221
  • 2
  • 13
  • 25

3 Answers3

30

You need to use http://developer.android.com/reference/android/widget/CursorAdapter.html#getItem(int).

Cursor cursor = (Cursor) simple.getItem(position);
// retrieve the data from the cursor
Mojo Risin
  • 8,136
  • 5
  • 45
  • 58
  • thanks for it @Mojo Risin! i've implemented the code like this `Cursor cursor = (Cursor) simple.getItem(position); Log.v("cursor",cursor.getString(1))` but it turns error == android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 ---- sth wrong with it? – BolbazarMarme Mar 21 '11 at 15:07
  • 8
    The proper way to do this is cursor.getString(cursor.getColumnIndex("my_column_name")); – Mojo Risin Mar 21 '11 at 16:01
  • i think this is not about your methods..., because everytime i want to access the cursor it turns same error "index 0 requested, with a size of 0".... i think maybe the cursor is loosing its content when i click one of the item..., sorry for bothering u again... – BolbazarMarme Mar 22 '11 at 07:24
  • 2
    I don't know how you are using this but this is working. Follow this tutorial to create SimpleCurosrAdapter demo project - http://thinkandroid.wordpress.com/2010/01/09/simplecursoradapters-and-listviews/. In the end of the onCreate method add getListView().setOnItemClickListener(this); and implement onItemClicked like this @Override public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) { Cursor c = (Cursor) arg0.getAdapter().getItem(arg2); Log.e("Demo", c.getString(c.getColumnIndex(People.NAME))); } – Mojo Risin Mar 22 '11 at 09:00
  • Thank you so much for answering.... U had gimme lots of cursor methods... btw I'm not use cursor to get the string anymore, i just make a new class to store the string temporarily outside mainactivity.... – BolbazarMarme Mar 24 '11 at 10:35
  • 1
    I wondered what that method could return. This is not documented, do you think we can be sure that future apis will keep returning that? – bigstones Aug 29 '12 at 22:29
1

This seems to be a problem with SimpleCursorAdapter on 2.1, on 2.2 the cursor is positioned on the requested item and you can retrieve the column data but in 2.1 the cursor position is 0 and cursor.move(itemIndex) and cursor.moveToFirst() both return false.

I plan to do a RYO database adapter.

naXa stands with Ukraine
  • 35,493
  • 19
  • 190
  • 259
1

Getting string from SimpleCurstor Adapter using cursor

    @Override
public boolean onSuggestionClick(int position) {
    //First get cursor from your Adapter,
    Cursor cursor = (Cursor) mAdapter.getItem(position);
    /* Then get string data from cursor's column, I am getting it from column 0 in this case. You can use your own column index. */
    String s=cursor.getString(0);
    //Then set the searchview or autotextview with that string
    mSearchView.setQuery(s, true); //true will submit the query 
}