2016-06-15 15 views
2

アプリの簡単な設定ページを作成しようとしています。SpinnerをListViewに動的に追加したときにSpinnerの選択したアイテムにアクセスするにはどうすればよいですか?

レイアウトをXMLファイルで定義するオブジェクトのリストを作成したいとします。

これらのオブジェクトのレイアウトには、タイトルTextView、ヘルプTextView、およびスピナーがあります。

私はこれらのオブジェクトをコードで動的に追加するので、これらの個々のSpinnerビューを参照して、選択した値を取得できるようにするにはどうすればよいですか?

私は現在の設定オブジェクト(リストが移入されるもの)があります。

public class Setting { 

    private String name; 
    private String description; 
    private String[] values; 

    public Setting(String name, String description, String[] values) { 
     this.name = name; 
     this.description = description; 
     this.values = values; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public String[] getValues() { 
     return values; 
    } 
} 

にビューにオブジェクトを設定する翻訳するカスタムArrayAdapterを:

(R.layout.spinner_row_text_layout.xmlがありますスピナーの項目のレイアウトを定義するための単なるテキストビュー)

public class SettingsAdapter extends ArrayAdapter<Setting> { 

    public SettingsAdapter(Context context, ArrayList<Setting> settings) { 
     super(context, 0, settings); 
    } 

    @Override 
    // Takes the position in the array, the view to convert, and the parent of the view as parameters 
    public View getView(int position, View convertView, ViewGroup parent) { 

     // Get the item in this position 
     Setting setting = getItem(position); 

     // Check if a view is being reused, otherwise inflate the view (look at view recycling in lists) 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.settings_row_view, parent, false); 
     } 

     // findViewById in the given view to convert 
     TextView title = (TextView) convertView.findViewById(R.id.titleText); 
     TextView help = (TextView) convertView.findViewById(R.id.helpText); 
     Spinner spinner = (Spinner) convertView.findViewById(R.id.spinner); 

     ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues()); 
     spinner.setAdapter(spinnerAdapter); 

     title.setText(setting.getName()); 
     help.setText(setting.getDescription()); 

     return convertView; 
    } 
} 

そして、次のレイアウトファイル...

設定ページレイアウト:各リストビュー項目の

<RelativeLayout 

    android:id="@+id/relativeLayout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.cgillions.counter.SettingsActivity"> 

    <ListView 
     android:id="@+id/settingsList" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:choiceMode="singleChoice" 
     android:divider="@color/black" 
     android:dividerHeight="5dp"/> 

</RelativeLayout> 

レイアウト:私は設定ページのレイアウトに対応して活動を開始すると

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"> 

     <TextView 
      android:id="@+id/titleText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 

      android:text="Hello" 
      android:textSize="20sp" 
      android:textColor="@color/black" 

      android:gravity="center_vertical"/> 

     <TextView 
      android:id="@+id/helpText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 

      android:text="@string/animation_settings_hint" 
      android:textSize="12sp" 
      /> 

    </LinearLayout> 

    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1.5"/> 

</LinearLayout> 

、私は次のエラーを取得する:

junit.framework.Assert.assertNotNull(Assert.java:211)

at com.example.cgillions.counter.SettingsActivity。 onCreate android.app.Activity.performCreateで(SettingsActivity.java:46)

(Activity.java:5990)

これは私のonCreate(ある)メソッド:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_settings); 

    setTitle("Settings"); 

    // Create a new Setting object in order to populate list 
    animSetting = new Setting("Animation", getResources().getString(R.string.animation_settings_hint), getResources().getStringArray(R.array.anim_values)); 

    settings = new ArrayList<>(); 
    settings.add(animSetting); 

    ListView settingsList = (ListView) findViewById(R.id.settingsList); 
    assertNotNull(settingsList); 
    settingsList.setAdapter(new SettingsAdapter(this, settings)); 

    animSpinner = (Spinner) settingsList.findViewById(R.id.spinner); 
    assertNotNull(animSpinner); 
} 

エラーが発生した上最後の行 - たとえばID 'spinner'を持つビューが見つかりません(したがって、nullです)。私は間違ってSpinnerにアクセスしています - これをどうすればいいのかアドバイスできますか?

Spinnerオブジェクトを取得して、選択したアイテムを取得したいとします。

+0

R.idspinnerはリストビュー内のレイアウトではなく、内部ビューのレイアウトであり、すべての行にSpinnerの新しいインスタンスがあります。なぜ、アクティビティにスピナーが必要ですか? (そして、どちらが1行目の行か2行目の行かなど) – CLucera

+0

「内側のビューのレイアウトは何ですか?私は新しいインスタンスを持つ各行についてあなたが言っていることを知っています - どのように個々のリスト項目にアクセスしますか?この場合、最初のアイテムのスピナーが必要です(リスト内に1つの設定しかないので...) – Charlie

+0

私は選択されたアイテムを引っ張り、別のアクティビティでビヘイビアを変更できるように、アクティビティのスピナーを必要としました。 – Charlie

答えて

2

何かお試しください。あなたのgetViewメソッド()メソッドでは、次に

public class Setting { 

    private String name; 
    private String description; 
    private String[] values; 
    private Spinner spinner; 

    public Setting(String name, String description, String[] values) { 
     this.name = name; 
     this.description = description; 
     this.values = values; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public String[] getValues() { 
     return values; 
    } 

    public void setSpinner(Spinner s) { 
     spinner = s; 
    } 

    public Spinner getSpinner() { 
     return spinner; 
    } 
} 

、あなたの設定インスタンスにスピナーを提供します:あなたの設定クラスにスピナーインスタンスを追加します

ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues()); 
spinner.setAdapter(spinnerAdapter); 
if (setting.getSpinner() == null) { 
    setting.setSpinner(spinner); 
} 

を次に、[設定]のリストにアクセスすることができます仮定それぞれに関連付けられたスピナーにアクセスできます。空のスピナーを持つ設定が見つかった場合は、アクティビティで表示されることはありません。これは、ユーザーが変更したことがないことを意味します。しかし、それが本当にあなたが望むものなのかどうかはわかりません。

これにより、各設定のスピナーにアクセスできますが、ユーザーの選択内容を保存したり、選択した項目をスピナーに設定するロジックがありません。つまり、スピナーにオプションA、B、Cがあり、ユーザーがBを選択した場合は、Bを読み取ることができますが、保管する場所はありません。 Settingクラスには、選択した値を保持するフィールドが必要です。 getView()メソッドは、spinner.setSelection()を呼び出して、現在の値としてBを表示するように指示する必要があります。それ以外の場合は、ユーザーが以前に選択した内容に関係なく、常にAが表示されます。

+0

私はこの解決策が好きです。各設定がスピナーを持つことは意味があります。しかし、私が各Spinnerの値を読み込もうとすると、それらはすべて同じ値(* last * SettingのSpinnerの値がリストに追加された値)になります。 – Charlie

+0

現時点では、アニメーションと背景の2つの設定があります。 次の行が表示されます。 System.out.println(settings.get(0).getName()); System.out.println(settings.get(0).getSpinner()。getSelectedItem()。toString()); System.out.println(settings.get(1).getName()); System.out.println(settings.get(1).getSpinner()。getSelectedItem()。toString()); アニメーションを印刷\ n白い\ n背景\ n白い – Charlie

+0

これはまだ解決しましたか?そうでなければ、次に試してみたいのは、ListViewで 'onItemClick()'のテストをセットアップすることです。 3番目の引数は 'int pos'で、ListViewの行をクリックします(0から始まる)。スピナーの項目を選択するときに 'settingsList.onItemClick()'イベントがスローされるかどうかを確認してください。そうした場合は、スピナーで選択した値を 'settingsList.onItemClick()'イベントに関連付けられたSettingsインスタンスに保存します。 –

関連する問題