0

私の Android アプリケーションは、複数のアクティビティ、1 つのサービス (リモート サーバーと通信する)、および SQLite データベースによって形成されます。データベースのテーブルからユーザーにデータを表示するには、多くの問題があります。

私はたくさんのグーグルを作り、listViewとtableViewの両方を試しました。最初のものは、多くの試行の後、いくつか機能します。クラス OffViaggListActivity は、アプリケーション内の固有のサービス (Servizio と呼ばれる) にバインドし、バインドが完了すると、Servizio のメソッド (eseguiComandoLocale(...)) を呼び出します。このメソッドは、SQLite データベースに対してクエリを実行し、 listView で使用されるカーソル。

最初の問題: テーブルの最後のフィールドのみが表示されるようになりました。9 つのフィールドすべてを表示し、ユーザーがいずれかを選択したときに、ユーザーがいくつかの機能 (「行の削除」など) を有効にできるようにしたいと考えています。

2 番目の問題: アクティビティを閉じてから再度開くと、リストが空のままになり、アクティビティを再度閉じると、「IllegalArgumentException: サービスが登録されていません」というメッセージが表示されます。

コード:

1) リストアクティビティ:

public class OffViaggListActivity extends ListActivity {

    static Servizio mioServizio;
    ServiceConnection myConn;

    ListView lista;
    Button chiudi;

     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.offerteviaggilist);

            lista=(ListView) findViewById(android.R.id.list);
            chiudi=(Button) findViewById(R.id.OffViaggChiudiButton);

            chiudi.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    OffViaggListActivity.this.unbundService();
                    OffViaggListActivity.this.finish();
                }
            });

            if(mioServizio==null){
            myConn=new ServiceConnection() {

                @Override
                public void onServiceDisconnected(ComponentName name) {
                    // TODO Auto-generated method stub
                    mioServizio=null;
                    Log.d("OffViaggListActivit", "Servizio disconnesso");
                }

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                    // TODO Auto-generated method stub
                    Servizio.LocalBinder binder=(Servizio.LocalBinder)service;
                mioServizio=binder.getService();
                Log.d("OffViaggListActivit", "Servizio connesso");

                    String[] displayFields = new String[] {DBSQLite.OFFV_KEY_ROWID,
                            DBSQLite.OFFV_KEY_USER,DBSQLite.OFFV_KEY_PART,
                            DBSQLite.OFFV_KEY_DEST,DBSQLite.OFFV_KEY_DATA,
                            DBSQLite.OFFV_KEY_ORA,DBSQLite.OFFV_KEY_POSTI,
                                DBSQLite.OFFV_KEY_COSTO,DBSQLite.OFFV_KEY_DETTAGLI};


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

                  Cursor cur=mioServizio.eseguiComandoLocale
                                         (OffViaggListActivity.this,"OffertePubblicate");

                    setListAdapter(new SimpleCursorAdapter
                                         (OffViaggListActivity.this.getApplicationContext(), 
                             android.R.layout.simple_list_item_1, cur, 
                             displayFields, displayViews));
                }
            };

            bindService(new Intent(OffViaggListActivity.this, Servizio.class), 
                                    myConn, Context.BIND_AUTO_CREATE);
            }

       }



        public void unbundService(){
            unbindService(myConn);
        }

}

2) XML レイアウト:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent" android:orientation="vertical">
        <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@id/android:list"></ListView>
        <Button android:layout_height="wrap_content" android:id="@+id/OffViaggChiudiButton" android:text="@string/chiudi" android:layout_width="match_parent"></Button>
    </LinearLayout>

構文やフォーマットのエラーがあった場合はご容赦ください。

4

1 に答える 1

1

1) SimpleCursorAdapter のレイアウト id パラメータ、つまり 2 番目のパラメータは、カーソル クエリによって返される各レコードのレイアウトを表すと想定されています。

ここでは、単一の TextView である simple_list_item_1 を返しています。このレイアウトでは、複数のフィールドを表示することはできません。

もちろん9つの異なるIDを持つ9つのTextViewで独自のレイアウトを作成し、それをdisplayViews配列に設定し、このレイアウトのIDをSimpleCursorAdapterに与える必要があります。

2) 申し訳ありませんが、私はまだサービスを扱っていません。Android docsを見ると、 onDestroy メソッドで unbindService を呼び出す必要があります。ここに、「unbundService」メソッドがあります。onDestroy から呼び出されますか?

于 2011-04-07T16:48:13.047 に答える