Fragment 中可靠的微调器

问题描述 投票:0回答:1

我正在尝试在 Fragment 中创建可靠的微调器。 有 2 个微调器,微调器 7 中的值取决于微调器 3 中的值

public class PageFragment1 extends Fragment implements AdapterView.OnItemSelectedListener {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {


        ViewGroup rootView = (ViewGroup) inflater
                .inflate(R.layout.page_1, container
                        , false);

        Spinner spinner3 = (Spinner) rootView.findViewById(R.id.spinnerAxles);
        ArrayAdapter<CharSequence> adapter3 = ArrayAdapter.createFromResource(getActivity(), R.array.Axles, android.R.layout.simple_spinner_item);
        adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner3.setAdapter(adapter3);
        spinner3.setOnItemSelectedListener(this);

        Spinner spinner7 = (Spinner) rootView.findViewById(R.id.spinnerTrailAxle);
        ArrayAdapter<CharSequence> adapter7 = ArrayAdapter.createFromResource(getActivity(), R.array.TrailAxle, android.R.layout.simple_spinner_item);
        adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner7.setAdapter(adapter7);
        spinner7.setOnItemSelectedListener(this);

        return rootView;

    }


@Override
    public void onItemSelected (AdapterView<?> parent, View view, int position, long id) {

        Spinner spinner3 = (Spinner) getActivity().findViewById(R.id.spinnerAxles);
        ArrayAdapter<CharSequence> adapter3 = ArrayAdapter.createFromResource(getActivity(), R.array.Axles, android.R.layout.simple_spinner_item);
        adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner3.setAdapter(adapter3);
        spinner3.setOnItemSelectedListener(this);

        Spinner spinner7 = (Spinner) getActivity().findViewById(R.id.spinnerTrailAxle);
        ArrayAdapter<CharSequence> adapter7 = ArrayAdapter.createFromResource(getActivity(), R.array.TrailAxle1, android.R.layout.simple_spinner_item);
        adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner7.setAdapter(adapter7);
        spinner7.setOnItemSelectedListener(this);

String AxlesText = spinner3.getSelectedItem().toString();

if (AxlesText.equals("6x2")) {
Spinner spinner7 = (Spinner) getActivity().findViewById(R.id.spinnerTrailAxle);
        ArrayAdapter<CharSequence> adapter7 = ArrayAdapter.createFromResource(getActivity(), R.array.TrailAxle1, android.R.layout.simple_spinner_item);
        adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner7.setAdapter(adapter7);
        spinner7.setOnItemSelectedListener(this);
        } else {
Spinner spinner7 = (Spinner) getActivity().findViewById(R.id.spinnerTrailAxle);
        ArrayAdapter<CharSequence> adapter71 = ArrayAdapter.createFromResource(getActivity(), R.array.TrailAxle1, android.R.layout.simple_spinner_item);
        adapter71.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner7.setAdapter(adapter71);
        spinner7.setOnItemSelectedListener(this);
        }

    }

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

    }

}

程序根据spinner3中的值替换了spinner7中的下拉列表,但是我不能从这个下拉列表中选择项目。 无论我选择什么,spinner7 总是显示下拉列表中的第一项。

java android fragment spinner
1个回答
0
投票

在解决您的问题时要记住两点:

  1. 在初始化 ArrayAdapter 时传入数据的“引用”。例如。列表效果很好
  2. 调用
    notifyDataSetChanged()
    每当适配器中的数据 变化

此外,您不需要在每次选择时都重新初始化整个适配器。相反,您可以像这样简化代码:

public class PageFragment1 extends Fragment implements AdapterView.OnItemSelectedListener {

    private ArrayAdapter<CharSequence> adapter3, adapter7;
    private List<CharSequence> spinner7DataList; // Save a reference to your data here

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {


        ViewGroup rootView = (ViewGroup) inflater
                .inflate(R.layout.page_1, container
                        , false);

        Spinner spinner3 = (Spinner) rootView.findViewById(R.id.spinnerAxles);
        adapter3 = ArrayAdapter.createFromResource(getActivity(), R.array.Axles, android.R.layout.simple_spinner_item);
        adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner3.setAdapter(adapter3);
        spinner3.setOnItemSelectedListener(this);

        spinner7DataList = new ArrayList<>(); // Initialize your data
        spinner7DataList.addAll(Arrays.asList(getContext().getResources().getStringArray(R.array.TrailAxle)));
        Spinner spinner7 = (Spinner) rootView.findViewById(R.id.spinnerTrailAxle);
        adapter7 = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, spinner7DataList);
        adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner7.setAdapter(adapter7);
        spinner7.setOnItemSelectedListener(this);

        return rootView;

    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        // Verify that the adapter that triggered this method is the one you want
        if (adapterView!= null && adapterView.getId() == R.id.spinnerAxles) {
            String axlesText = adapter3.getItem(position).toString();
            if (axlesText.equals("6x4")) {
                // Note that we are not updating the adapter here, just the list that was passed to it previously
                spinner7DataList.clear();
                spinner7DataList.addAll(Arrays.asList(getContext().getResources().getStringArray(R.array.TrailAxle2))); // Load the new data into the list
                adapter7.notifyDataSetChanged(); // Important, this will ensure that your data changes are reflected on the Spinner
            } else if (axlesText.equals("3x2")) { // Any other conditions if needed

            }
        }
    }

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

    }

这个答案有效,因为您通过引用

spinner7DataList
来传递
adapter7
。因此,每当您在
spinner7DataList
中操作数据时,它都会反映在
adapter7

© www.soinside.com 2019 - 2024. All rights reserved.