2

コードの「更新」の下に問題チェックが見つかりました

さて、私はSqliteからスピナーに正しい値をロードするのに問題があります。これが私のアプリの構築方法です

私のonCreate()は、次の方法でspinTypesというスピナーを設定します。

public class MyClass extends Activity{
 // local members . . . 
     .
     .
     .
 //spinner 
 private Spinner spinTypes, spinNames = null;

 // string array decl.
 private String [] types, names1, names2, names3 = null;

 // array adapters for string arrays
 private ArrayAdapter<String> typesAdapter, names1Adapter,
                             names2Adapter, names3Adapter;

 // create a Dbhelper object to access the db
 private DbHelper mdbHelper = null;

// on create
 @Override
 public void onCreate(Bundle savedIstanceState){
  // call to super class
  // set my content view
  // instantiate all members 

  // Dbhelper object to access the db
  mdbHelper = new DbHelper(getBaseContext());

  // spinners
  spinTypes = (Spinner) findViewById(R.id.spin_types);
  spinNames = (Spinner) findViewById(R.id.spin_names);

 // get string arrays from resources and create a ArrayAdapter<string>
 types = getResources().getStringArray(R.array.types);

 typesAdapter = new ArrayAdapter<String>(getBaseContext(),
                                        android.R.layout.simple_spinner_item, types);
 typesAdapter. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

 // want to create a dynamic spinner based on these arrays
 names1 = getResources().getStringArray(R.array.names_1); 
 names2 = getResources().getStringArray(R.array.names_2);
 names3 = getResources().getStringArray(R.array.names_3);

 // do this for all names++ arrays
 names1Adapter = new ArrayAdapter<String>(getBaseContext(),
                                        android.R.layout.simple_spinner_item, names1);
 names1Adapter. setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

 // etc . . . for the other two

 // set the adapter for the types spinner
 spinTypes.setAdapter(typesAdapter);

}

すべてのデータをデータベースに挿入するための作成方法がありますが、これは正常に機能します。問題は、エントリを編集するためにスピナーにデータを入力しようとする場合です。

アプリはそのように機能します。追加ボタンを押すと、呼び出し元のビューにリストアイテムを作成するダイアログがポップアップ表示されます。2つのスピナーを使用して作成します。1つはタイプに基づいて2番目の名前のスピナーを動的に設定するタイプ用です。

データベースオブジェクトにアクセスすると、スピナーから文字列が返されますが、何らかの理由で、配列内の文字列の位置をチェックするifステートメントを作成すると、2番目のスピナーが毎回位置0を設定します。

上記のifステートメントを含むメソッドは次のとおりです。

public void populate(){
  mdbHelper.open();
  // if there is an item create a cursor rowId != null
  Cursor mTypes = mdbHelper.fetchItem(rowId);
   if(mTypes.moveToFirst()){
   String tType = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_TYPE));
   String tName = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_NAME));

  int t = spinTypes.getPosition(tType);
  spinTypes.setSelection(t);

  // ** this does not seem to do the job i want it to**
  if(t == 0){
    spinNames.setAdapter(names1Adapter); // set the adapter based on t value
    int n1 = names1Adapter.getPosition(tName); // use name return from db to get pos
    spinNames.setSelection(n1);            // set the position
  }else if(t ==1){
    spinNames.setAdapter(names2Adapter);
    int n2 = names1Adapter.getPosition(tName);
    spinNames.setSelection(n2);
  }else{
    spinNames.setAdapter(names3Adapter);
    int n3 = names3Adapter.getPosition(tName);
    spinNames.setSelection(n3);
  }

}// end populate

} // end class

スピナーはすべて機能しますが、tNameが返される値にはなりません。

誰かがこれを手伝うことができますか?

**データベースから返された名前をログに記録し、それを使用してエラー内のアイテムのインデックスを見つけ、正しい値を返しますが、スピナーのデフォルトは0のままです**

誰かが私のエラーが何であるか知っていますか?お願いします

更新(以下に投稿された最終コード) これを機能させるためにかなりの変更を加えました。私が何をしたかを理解するために、この投稿全体を読んで、何も見逃さないようにする必要があります。

前に変数を追加しましたonCreate() private int spinNamePos;

の最後の行の後にこの行を追加しましたonCreate()

// add a listener to the spinner
spinTypes.setOnItemSelectedListener(TypesListener);

このリスナーをそのように作成しました

OnItemSelectedListener TypesListener = new OnItemSelectedListener(){
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id){
    // use the position of this spinner to set the second spinner
     switch(pos){
     case 0 :
        spinNames.setAdapter(names1Adapter);
        break;
      //etc. .  for the other two
     case 1:
        // etc
       break;
     }
     case 2:
        // etc
       break;
     }
     // created an int for the position of the second spinner before calling onCreate()
     // and use it to set this spinners position
     spinNames.setSelection(spinNamePos); 
 // this value is grabbed in onSavedInstanceState() and used to set the pos when onRestoreInstanceState() is called to handle orientation changes and activity paused
  }
 };

次にonPopulate()、新しいメソッドを呼び出して2番目のスピナーの位置を設定するように変更しました。

 public void populate(){
  mdbHelper.open();
  // if there is an item create a cursor rowId != null
  Cursor mTypes = mdbHelper.fetchItem(rowId);
   if(mTypes.moveToFirst()){
   String tType = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_TYPE));
   String tName = mTypes.getString(mTypes.getColumnIndexOrThrow(DbAdapter.KEY_NAME));

  int t = spinTypes.getPosition(tType);
  spinTypes.setSelection(t);

  // call to the new method
  spinNamePos = setSpinNamesPos( t, tName);
  // set the position
  spinNames.setSelection(spinNamePos)


}// end populate

// new method to set the position when i want to update/change the list item

private int setSpinNamesPos(int m, String name){
 int pos = 0;
 switch(m){
  case 0:
    pos = names1Adapter.getPosition(name);
    break;
  case 1:
    pos = names2Adapter.getPosition(name);
    break;
   case 2:
    pos = names3Adapter.getPosition(name);
    break;
  }
 return pos;
}

これが機能するのを見てとても幸せです質問やコメントが奨励されています

4

1 に答える 1

1

さて、数週間後、私は自分の答えを理解したようです!私が抱えていた問題は、私の最初の設定OnItemSelectedListener()が行われるたびに呼び出されることに気付いていなかったことです。adapterspinner

これに気付いたので、最初のspinnerを設定し、OnItemSelectedListener()これを使用しspinner idて2番目の設定を行います(つまり、2番目のを3つの選択肢のうちの1つに設定したことにspinner adapter基づいています)。idadapterspinner

これadapterが設定された後value、私はmyから返された文字列を使用cursorしてthis内の文字列を検索し、my内ののにadapter設定spinnerします。positionstringarray

これですべてうまく機能し、上記の最終的なコードをUPDATEタイトルの下に配置します。すべての助けをありがとう。

于 2012-11-09T15:30:51.963 に答える