2017-03-07 4 views
1

AlertDialogのスピナーをフィルターとして使用しています。アイテムを選択した後にダイアログを再度開くと、デフォルトで選択したアイテムを前から選択したいと考えています。しかし、ある種の魔法が起きているのですが、なぜスピナーが間違ったアイテムを選んでいるのか理解できません。スピナーの項目リストは、4から42までの数字を持つ文字列配列です。{"4","6",.."42"} 最初の項目"4"を選択すると、位置は0になります。ダイアログを再度開くと、正確な項目が表示されます。しかし、その代わりに、それは位置にアイテム"10"を表示する4.Android - スピナーの位置の値

コードDialogfragment:

public class FittingSelectionDialogFragment extends DialogFragment { 

private String dTitle; 

    private String[] list; 

    private int position; 

    private String filterItem; 

    private List<String> chosenFilterItems; 

    public interface FittingSelectionDialogListener { 
     public void onChosenDialogItem(String filterStrings,int menuPosition); 
    } 

    FittingSelectionDialogListener mListener; 


    public Dialog onCreateDialog(Bundle savedInstanceState){ 
      final Spinner spinner2 = new Spinner(getActivity()); 
      final TextView label = new TextView(getActivity()); 
      final TextView label2 = new TextView(getActivity()); 
      LinearLayout layout = new LinearLayout(getActivity()); 

      layout.setOrientation(LinearLayout.HORIZONTAL); 
      layout.setGravity(Gravity.CENTER); 

      ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getContext(), R.layout.support_simple_spinner_dropdown_item, list); 
      spinner2.setAdapter(adapter2); 

      if(chosenFilterItems.get(position).equals("")) { 
       spinner2.setSelection(0); 
      } 
      else{ 
       spinner2.setSelection(Integer.valueOf(chosenFilterItems.get(position))); 
      } 

      label.setText("Rohr AD:"); 
      label.setTextColor(getResources().getColor(R.color.colorParkerBlack2)); 
      label.setTextSize(16); 

      label.setPadding(60,0,40,0); 

      label2.setText("mm"); 
      label2.setTextSize(16); 
      label2.setTextColor(getResources().getColor(R.color.colorParkerBlack2)); 

      dialog.setTitle(getdTitle()); 

      layout.addView(label); 
      layout.addView(spinner2); 
      layout.addView(label2); 

      dialog.setView(layout); 

      spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       @Override 
       public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int spinner2Position, long id) { 
        filterItem = list[spinner2Position]; 
        chosenFilterItems.set(position,String.valueOf(spinner2Position)); 
        Toast.makeText(getContext(),chosenFilterItems.get(position),Toast.LENGTH_SHORT).show(); //correct value 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> adapterView) { 

       } 
      }); 
      dialog.setPositiveButton("Bestätigen", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 
        mListener.onChosenDialogItem(filterItem,position); 
        Toast.makeText(getContext(),chosenFilterItems.get(position),Toast.LENGTH_SHORT).show();//wrong value 
        dismiss(); 
       } 
      }); 
      dialog.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 
        filterItem = ""; 
        chosenFilterItems.set(position,""); 
        mListener.onChosenDialogItem(filterItem, position); 
       } 
      }); 
      return dialog.create(); 
    } 
} 

私は、リスナー内部の2枚のトーストを作りました。狂ったことは、OnItemSelectedListenerに正しい位置の値が表示されることです。 PositiveButtonでOnClickListenerが間違った値を表示しています。何かお考えですか?

+0

がデバッガに移動して、何が起こっているか見ます。それがなければそれをするのは難しいです。 – Vucko

+0

私はあなたがマップとしてリストを使用することがわかります。とにかくmap/HashMapを使わないのはなぜですか? – gvlachakis

答えて

0

使用Handler

int delay = 1000; 
runOnUiThread (new Runnable() { 
     @Override 
     public void run() { 

      if(chosenFilterItems.get(position).equals("")) { 
       spinner2.setSelection(0); 
      } else { 
       Integer.valueOf(chosenFilterItems.get(position))); 
      } 
     } 
}, delay); 
1

多少の遅延を追加し、私は自分で回避策を作りました。私はデバッグによって間違いを見つけられませんでした。だから私はその職に就いていない。値を使用して選択したアイテムを再選択します。最善の方法ではありませんが、この小さな項目リストのために働きます。

コード:

if(chosenFilterItems.get(position).equals("")) { 
    spinner2.setSelection(0); 
} 
else{ 
    for(int i=0; i<list.length;i++){ 
     if(list[i].equals(chosenFilterItems.get(position))){ 
      spinner2.setSelection(i); 
     } 
    }  
} 

spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
@Override 
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int spinner2Position, long id) { 
    filterItem = list[spinner2Position]; 
} 

dialog.setPositiveButton("Bestätigen", new DialogInterface.OnClickListener() { 
@Override 
public void onClick(DialogInterface dialogInterface, int i) { 
    chosenFilterItems.set(position,filterItem); 
    mListener.onChosenDialogItem(filterItem,position); 
    dismiss(); 
} 
}); 
関連する問題