Android SimpleCursorAdapter results not displaying

2019-04-16 19:45发布

I was looking for an alternative to a spinner, since the first item is always selected (which causes me issues), and I found some examples for using an AlertDialog with a list instead.

I am having two problems:

  1. The list is displaying and is formatted ok, but there are no values in it. I know the query is returning, and the cursor/adapter has the data in it.

  2. This may be a symptom of #1 - but when I select a blank row, the Cursor cursor2 = (Cursor) ((AdapterView) dialog).getItemAtPosition(which); statement causes a crash (it's a ClassCastException).

I had similar code previously which set the adapter to a spinner object, and the data was displaying fine.

I don't think the adapter is getting set correctly, and I have been unable to come up with a solution thus far.

Any thoughts?

Thanks!

btnDenomination.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View w) 
        { 
            Cursor cursor = coinDB.myDataBase.rawQuery("select _id, denomination_desc from denomination", null); // must select the _id field, but no need to use it
            startManagingCursor(cursor); // required in order to use the cursor in 

            String[] from = new String[] {"denomination_desc" }; // This is the database column name I want to display in the spinner
            int[] to = new int[] { R.id.tvDBViewRow }; // This is the TextView object in the spinner

            cursor.moveToFirst();

            SimpleCursorAdapter adapterDenomination = new SimpleCursorAdapter(CoinsScreen.this, 
                    android.R.layout.simple_spinner_item, cursor, from, to  ); 

            adapterDenomination.setDropDownViewResource(R.layout.db_view_row); 

             new AlertDialog.Builder(CoinsScreen.this) 
              .setTitle("Select Denomination") 
              .setAdapter(adapterDenomination, new DialogInterface.OnClickListener() 
              { 

                public void onClick(DialogInterface dialog, int which) 
                { 

                    Cursor cursor2 = (Cursor) ((AdapterView<?>) dialog).getItemAtPosition(which);
                    strDenomination_id = cursor2.getString(0); // Gets column 1 in a zero based index, the first column is the PKID.  this could
                    // be avoided by using a select AS statement.

                    Log.d("Item Selected", strDenomination_id );   

                    TextView txtDenomination = (TextView) findViewById(R.id.textDenomination); 
                    txtDenomination.setText(cursor2.getString(1));  


                  dialog.dismiss(); 
                } 
              }).create().show(); 
        } 
    });

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

<TextView android:text=""
android:id="@+id/tvDBViewRow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF0000" />

</LinearLayout> 

2条回答
SAY GOODBYE
2楼-- · 2019-04-16 20:26

So new answer for the second issue :)

I think you should reuse the initial cursor instead of trying to get a new one... Can you try to do :

adapterDenomination.moveToPosition(which);
strDenomination_id = adapterDenomination.getString(0);

in the onClick() ?

查看更多
冷血范
3楼-- · 2019-04-16 20:42

Are you sure R.id.tvDBViewRow is the id of the TextView in the layout android.R.layout.simple_spinner_item ? From this, the TextView's id should be android.R.id.text1.

查看更多
登录 后发表回答