开发者

Android dialog not displaying data sqlite

开发者 https://www.devze.com 2023-03-03 03:23 出处:网络
I am trying to display data from an SQLite database in a dialog. The data is a list of scores. All works well until I add a totals line and then it goes real haywire.

I am trying to display data from an SQLite database in a dialog. The data is a list of scores. All works well until I add a totals line and then it goes real haywire.

This is the source:

            DBAdaptor dbAdaptor;
        Cursor scoresCursor;
        Cursor totalsCursor;
        //ScoresDisplayerAdaptor scoresDisplayerAdaptor;  

        dbAdaptor = new DBAdaptor(this);
        dbAdaptor.open();
        scoresCursor = dbAdaptor.getScores();
        totalsCursor = dbAdaptor.getTotalScores();


        startManagingCursor(scoresCursor);
        startManagingCursor(totalsCursor);

        //scoresDisplayerAdaptor = new ScoresDisplayerAdaptor(this,scoresCursor);

        final Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.scores);
        ListView lv = (ListView)dialog.getWindow().findViewById(R.id.lvwScores);
        ((TextView) dialog.findViewById(R.id.tvwPlayer1Name)).setText(players[0].playerName);
        ((TextView) dialog.findViewById(R.id.tvwPlayer2Name)).setText(players[1].playerName);

        switch (settings.getNumberOfPlayers())
        {
            case 2:
                lv.setAdapter(new SimpleCursorAdapter(this, R.layout.playerscoresrow, scoresCursor, 
                        new String[] {DBAdaptor.KEY_PLAYER1_SCORE,DBAdaptor.KEY_PLAYER2_SCORE}, 
                        new int[]    {R.id.tvwPlayer1Score,       R.id.tvwPlayer2Score }
                ));
                break;

            case 3: 
                ((TextView) dialog.findViewById(R.id.tvwPlayer3Name)).setText(players[2].playerName);
                lv.setAdapter(new SimpleCursorAdapter(this, R.layout.playerscoresrow, scoresCursor, 
                        new String[] {DBAdaptor.KEY_PLAYER1_SCORE,DBAdaptor.KEY_PLAYER2_SCORE,
                                      DBAdaptor.KEY_PLAYER3_SCORE}, 
                        new int[]    {R.id.tvwPlayer1Score,       R.id.tvwPlayer2Score, 
                                      R.id.tvwPlayer3Score}
                ));
                break;

            case 4:
                ((TextView) dialog.findViewById(R.id.tvwPlayer3Name)).setText(players[2].playerName);
                ((TextView) dialog.findViewById(R.id.tvwPlayer4Name)).setText(players[3].playerName);

开发者_开发问答                lv.setAdapter(new SimpleCursorAdapter(this, R.layout.playerscoresrow, scoresCursor, 
                        new String[] {DBAdaptor.KEY_PLAYER1_SCORE,DBAdaptor.KEY_PLAYER2_SCORE,
                                      DBAdaptor.KEY_PLAYER3_SCORE,DBAdaptor.KEY_PLAYER4_SCORE}, 
                        new int[]    {R.id.tvwPlayer1Score,       R.id.tvwPlayer2Score, 
                                      R.id.tvwPlayer3Score,       R.id.tvwPlayer4Score }
                ));
        }
/*
        lv.setAdapter(new SimpleCursorAdapter(this, R.layout.scores, totalsCursor, 
                new String[] {DBAdaptor.KEY_PLAYER1_TOTAL,DBAdaptor.KEY_PLAYER1_TOTAL,
                              DBAdaptor.KEY_PLAYER1_TOTAL,DBAdaptor.KEY_PLAYER1_TOTAL}, 
                new int[]    {R.id.tvwPlayer1Total,       R.id.tvwPlayer2Total, 
                              R.id.tvwPlayer3Total,       R.id.tvwPlayer4Total }
        ));*/
        dialog.setTitle("Scores");
        Button aButton = (Button)dialog.findViewById(R.id.btnOK);
        aButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                dialog.dismiss();
                askNewHand(); 

            } });
        dialog.show();
        dbAdaptor.close();

Where the two cursors are:

    public Cursor getScores(long rowId) throws SQLException 
{
    Cursor mCursor =
            db.query(true, DATABASE_TABLE, new String[] {
                    KEY_ROWID,
                    KEY_PLAYER1_SCORE,
                    KEY_PLAYER2_SCORE,
                    KEY_PLAYER3_SCORE,
                    KEY_PLAYER4_SCORE
                    }, 
                    KEY_ROWID + "=" + rowId, 
                    null,
                    null, 
                    null, 
                    null, 
                    null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}
public Cursor getTotalScores() {
    return db.rawQuery(
        "SELECT 0 as _id, SUM(" + KEY_PLAYER1_SCORE + ") as " + KEY_PLAYER1_TOTAL + ", " +
               "SUM(" + KEY_PLAYER2_SCORE + ") as " + KEY_PLAYER2_TOTAL + ", " +
               "SUM(" + KEY_PLAYER3_SCORE + ") as " + KEY_PLAYER3_TOTAL + ", " +
               "SUM(" + KEY_PLAYER4_SCORE + ") as " + KEY_PLAYER4_TOTAL + " " +
        "FROM " + DATABASE_TABLE,null);
}

The main XML looks like this:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content">

<LinearLayout 
  android:id="@+id/lloPlayerNames" xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content" 
  android:orientation="horizontal">
  <TextView
    android:id="@+id/tvwPlayer1Name" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:layout_marginRight="14.5sp"/>
  <TextView
    android:id="@+id/tvwPlayer2Name" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:layout_marginRight="14.5sp"/>
  <TextView     
    android:id="@+id/tvwPlayer3Name" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:layout_marginRight="14.5sp"/>
  <TextView     
    android:id="@+id/tvwPlayer4Name" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:layout_marginRight="14.5sp"/>
</LinearLayout>

<Button android:id="@+id/btnOK"
  android:layout_height="wrap_content" android:layout_width="wrap_content" 
  android:layout_weight="1"
  android:text="OK" android:layout_centerHorizontal="true" 

  android:layout_alignParentBottom="true" 

   />
<LinearLayout android:id="@+id/lloTotalScores" xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"
  android:layout_above="@id/btnOK">
  <TextView android:id="@+id/tvwPlayer1Total" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"/>
  <TextView android:id="@+id/tvwPlayer2Total" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"/>
  <TextView android:id="@+id/tvwPlayer3Total" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content"/>
  <TextView android:id="@+id/tvwPlayer4Total" android:layout_weight="1" android:gravity="right"
    android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginRight="14.5sp"/>
</LinearLayout>

<ListView 
   android:id="@+id/lvwScores" 
   android:layout_below="@id/lloPlayerNames"

   android:layout_above="@id/lloTotalScores"

   android:layout_width="fill_parent" android:layout_height="wrap_content"
   android:layout_centerHorizontal="true" />
</RelativeLayout>

As long as the lines filling the totals are commented out then the screen displayed is ok:

Android dialog not displaying data sqlite

However, as soon as I un-comment those lines to display the total I get this:

Android dialog not displaying data sqlite


From what I understand, you want a fixed list (row) of players at the top of your view plus a corresponding list (row) of their total scores at the bottom. Then inbetween, you want an expanding list of scores for each hand of a game that has been played. Am I right?

EDIT: OK, ignore my suggestion of using / extending HeaderViewListAdapter as ListView supports headers/footers natively and uses HeaderViewListAdapter internally (DOH!!!).

Try the following (not sure the code is 100% correct though)...

Do what you're currently doing to set the player names in the lloPlayerNames TextViews. Then adjust your code to set the lloTotalScores TextViews to contain the values returned from your getTotalScores() query. Then use something like...

LinearLayout llHeaderView = (LinearLayout) dialog.findViewById(R.id.lloPlayerNames);
lv.addHeaderView(llHeaderView);

...

LinearLayout llFooterView = (LinearLayout) dialog.findViewById(R.id.lloTotalScores);
lv.addFooterView(llFooterView);

Then you use lv.setAdapter() to put in the results from your getScores() query. NOTE: you MUST set the header and footer before calling setAdapter()

Hope that helps.


The problem is that your root layout is a RelativeLayout. So, what's happening is your second LinearLayout is covering up the first one.

You can solve this two ways:

  • Make your root layout a LinearLayout. This way, the second LinearLayout will be positioned after the first, instead of on top of it.
  • Add a "Margin-top" rule of say, 100px, to the 2nd linear layout. This will push it down and expose the 1st layout...


In the end I solved this by creating a new ListView for my totals under the one for the data and populating it with a new XML that I created. I don't know if this is the optimum way to go but at least it works.

0

精彩评论

暂无评论...
验证码 换一张
取 消