【问题标题】:How to keep value in Spinner when scrolling ListView with Spinner in it?滚动带有 Spinner 的 ListView 时如何在 Spinner 中保持价值?
【发布时间】:2015-06-25 13:26:38
【问题描述】:

我正面临这个问题,已经阅读了很多问题/答案,但无法解决。

我有一个带有 Spinner 的 ListView(用户必须为该行中的产品选择一个数量编号),但是当项目多于视图并且在 Spinner 中选择一个数字后滚动 ListView 时,此数字会消失,并且再次显示默认值。

我有一个正在为 ListView 本身的适配器内部创建的 Spinner 的适配器:

    final ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context, R.layout.layout_spinner_quanitdade, quantities) {

    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);
        ((TextView) v).setTextSize(18);
        return v;
    }

    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        View v = super.getDropDownView(position, convertView, parent);
        ((TextView) v).setGravity(Gravity.END);
        return v;
    }
};

holder.spinnerQuantidade.setAdapter(spinnerAdapter);
holder.spinnerQuantidade.setOnItemSelectedListener(new OnItemSelectedListener() {

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

        String newQuantity = quantities[spinnerPosition];
        item.setQuantidade(newQuantity);

        Spinner theSpinner = (Spinner) parent;
        theSpinner.setSelection(spinnerPosition);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

在尝试在 Spinner 中选择一个值之前(查看带有 IMEI 字样的行):

在微调器中为该行选择一个值后:

向上滚动然后向下滚动后(值变回 1,而不是我选择的 10):

更新:更改为尝试保留并设置微调器选择,无效:

    public View getView(final int modelPosition, View view, ViewGroup parent) {
    ViewHolder holder = null;
    final Produto item = getItem(modelPosition);

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (view == null) {
        view = mInflater.inflate(R.layout.item_view_produto, parent, false);
        holder = new ViewHolder();
        holder.textViewCodigo = (TextView) view.findViewById(R.id.textViewCodigo);
        holder.textViewNome = (TextView) view.findViewById(R.id.textViewNome);
        holder.spinnerQuantidade = (Spinner) view.findViewById(R.id.spinnerQuantidade);
        holder.spinnerQuantidade.setTag(modelPosition);

        CheckBox chk = (CheckBox) view.findViewById(R.id.checkBox);
        holder.checkBox = chk;
        holder.checkBox.setTag(modelPosition);

        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    if (modelPosition % 2 == 0) {
        view.setBackgroundResource(R.drawable.cor_zebra2);
    } else {
        view.setBackgroundResource(R.drawable.cor_zebra1);
    }

    holder.textViewCodigo.setText(item.getCodigo());
    holder.textViewNome.setText(item.getDescricao().trim());

// checking and settion spinner selection - DID NOT WORK
    if (mapRowSpinnerPos.containsKey(modelPosition)) {
        holder.spinnerQuantidade.setSelection(mapRowSpinnerPos.get(modelPosition));
    }

    if (this.showChecks) {
        holder.spinnerQuantidade.setVisibility(View.GONE);

        holder.checkBox.setOnCheckedChangeListener(null);
        holder.checkBox.setChecked(item.isChecked());
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                item.setChecked(isChecked);
                if (isChecked) {
                    selectedList.add(item);
                } else {
                    selectedList.remove(item);
                }
            }
        });
    } else {
        // situation 2: show spinners
        holder.checkBox.setVisibility(View.GONE);

        final ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context, R.layout.layout_spinner_quanitdade, quantities) {

            public View getView(int position, View convertView, ViewGroup parent) {
                View v = super.getView(position, convertView, parent);
                ((TextView) v).setTextSize(18);
                return v;
            }

            public View getDropDownView(int position, View convertView, ViewGroup parent) {
                View v = super.getDropDownView(position, convertView, parent);
                ((TextView) v).setGravity(Gravity.END);
                return v;
            }
        };

        holder.spinnerQuantidade.setAdapter(spinnerAdapter);
        holder.spinnerQuantidade.setOnItemSelectedListener(new OnItemSelectedListener() {

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

                // int thePosition = (Integer) parent.getTag();
                mapRowSpinnerPos.put(modelPosition, spinnerPosition);

                String newQuantity = quantities[spinnerPosition];
                item.setQuantidade(newQuantity);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }

    return view;
}

【问题讨论】:

    标签: android listview android-listview


    【解决方案1】:

    设置适配器后移动以下代码。设置适配器会将其设置为第一个位置。

    if (mapRowSpinnerPos.containsKey(modelPosition)) {
        holder.spinnerQuantidade.setSelection(mapRowSpinnerPos.get(modelPosition));
    }
    

    【讨论】:

      【解决方案2】:

      ListView 重用其视图,因此仅填充当前显示的视图。 因此,当列表项重新进入屏幕时,它会重新填充。

      为了保持每个微调器的状态,您的适配器应该有一个字段来保存每个项目的选定值,该值将从微调器选择中更新,然后,在 getView 方法上,您将从适配器检查该选择并设置微调器到所选项目。

      【讨论】:

      • 看我的更新,我按照你说的做了,完全没用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多