2015-06-25 89 views
1

我面臨這個問題,並已閱讀了很多問題/答案,但無法解決它。如何在使用Spinner滾動ListView時保持Spinner中的值?

我有一個ListView與微調(用戶必須爲該產品在該行中選擇一個數量編號),但是當有更多的項目比視圖和ListView滾動後,選擇一個數字在微調號碼這個數字消失,默認值會再次顯示。

我在適配器內部創建一個適配器微調的ListView控件本身: enter image description here

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) { 
    } 
}); 

試圖選擇在微調的值(看字IMEI行)之前

在微調該行選擇一個值後: enter image description here

滾動起來後,然後向下滾動(值變回1,研究所10的EAD我選擇): enter image description here

UPDATE:改變要儘量保持並設置微調選擇,沒有工作:

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; 
} 

回答

6

設置適配器後移動下面的代碼。設置適配器會將其設置爲第一個位置。

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

非常好,非常感謝你!我多麼傻! –

1

ListView重用自己的觀點,所以只有那些當前顯示的是人口稠密。 因此,當列表項重新進入屏幕時,它會重新填充。

爲了保持每個微調控制器的狀態,您的適配器應該有一個字段來保持每個項目的選定值,該值將從微調器選擇中更新,然後在getView方法中,您將檢查來自適配器的選擇並設置微調器到選定的項目。

+0

看到我的更新,我做了你說的,根本沒有工作 –