Sorry for the mouthful of a title, I have to cut it down because I exceeded the 150 character limit.

I have an AutoCompleteTextView (ACTV) and I am using a SimpleCursorAdapter since the normal ACTV only searches the user input at the start of each substring (substring are separated by whitespaces) and not within those substrings. For example, having a list with Adipose and Bad Wolf and searching ad will show Adipose only and not Bad Wolf. I already made the Adapter as shown below:

//create ACTV Here
AutoCompleteTextView search = (AutoCompleteTextView) findViewById(R.id.actvCatalogueSearch);
search.setThreshold(1);

String[] from = { "name" };
int[] to = { android.R.id.text1 };

SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, 
        android.R.layout.simple_dropdown_item_1line, null, from, to, 0);

cursorAdapter.setStringConversionColumn(1);

FilterQueryProvider provider = new FilterQueryProvider(){
    @Override
    public Cursor runQuery(CharSequence constraint) {
        // TODO Auto-generated method stub
        String constrain = (String) constraint;
        constrain = constrain.toUpperCase();
        Log.d("hi", "runQuery constraint: " + constraint);
        if (constraint == null) {
            return null;
        }
        String[] columnNames = { Columns._ID, "name" };
        MatrixCursor c = new MatrixCursor(columnNames);
        try {
            for (int i = 0; i < pdflist.length; i++) {
                if(pdflist[i].contains(constrain)){
                    Log.d("Hello","Match! pdflist item = " + pdflist[i]);
                    c.newRow().add(i).add(pdflist[i]);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }
};

cursorAdapter.setFilterQueryProvider(provider);
search.setAdapter(cursorAdapter);

This code enables me to show the other list items that contains the substring from the user input.

Now, I am trying to make the OnItemClickListener function properly. Here is what I have so far:

search.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        MatrixCursor matrix = (MatrixCursor)parent.getItemAtPosition(position);

        Log.d("hello", "matrix values is = " + matrix);

        String selection = matrix.getString(position);  
        Log.d("hallo","selection = " + selection);
        Log.d("hello","item id at position = " + parent.getItemIdAtPosition(position));

        int pos = (int) parent.getItemIdAtPosition(position);
        Log.d("sup", "position is = " + pos);
        String path = imagelist[pos].getAbsolutePath();
        openPdfIntent(path);
    }
});

Here, I am trying to get the MatrixCursor element at the given position. It works fine of the user selects the first 2 suggestions. However, when the user clicks the 3rd suggestion onwards, the application throws a CursorIndexOutOfBoundsException Requested Column: 2, # of columns: 2 Clicking on the logCat lines pointed me to the code String selection = matrix.getString(position);

I think that doing matrix.getString(position) causes the error since getString returns the value of the requested column as a String, and since there are only 2 columns, selecting a suggestion in the ACTV whose position (position as it is shown to the user, not the position of the said item in the list) is greater than 2 causes the code to screw up.

My question is, is there a better way to get the String value of the selected item given that I am using SimpleCursorAdapter? I've looked over the documentation of Matrix Cursor in the android dev site and I can't find a way to get a row/element based on the position.

Any help is very much appreciated.

Edit:

using matrix.moveToFirst(); as such did not help as well:

search.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        MatrixCursor matrix = (MatrixCursor)parent.getItemAtPosition(position);
        if(matrix != null) {
            if(matrix.getCount() > 0) {
                matrix.moveToFirst();
                String selection = matrix.getString(position);  

                int pos = (int) parent.getItemIdAtPosition(position);
                String path = imagelist[pos].getAbsolutePath();
                openPdfIntent(path);
            }    
        }
    }
});

and I still got the exception:

android.database.CursorIndexOutOfBoundsException: Requested column: 4, # of columns: 2

The requested column 4 is the position of the selected ACTV suggestion, indexed zero.

2

There are 2 answers

0
Razgriz On

Made it work using a different approach. I get the View and cast it as a TextView. From there, I get the String input. I then use this string and look for its position in the original list. Note that my list is an Array, not an ArrayList, that's why I had to loop through all the items.

search.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        TextView tv = (TextView) view;
        String userSelection = tv.getText().toString();
        Log.d("hello", "selection is = " + userSelection);

        int pos = -1;

        for (int i = 0; i < pdflist.length; i++) {
            if(pdflist[i].equalsIgnoreCase(userSelection)){
                pos = i;
            }
        }

        Log.d("hello","int position = " + pos);

        String path = imagelist[pos].getAbsolutePath();
        openPdfIntent(path);
    }
});
1
Pratik Butani On

Try out like this

MatrixCursor matrix = .............

Log.d("hello", "matrix values is = " + matrix);

/***** Check here Cursor is NOT NULL *****/
if(matrix != null) {
    if(matrix.getCount() > 0) {
        matrix.moveToFirst();
        /***
        Your Stuff will be here....
        **/
    }    
}