2014-02-25 30 views
0

我有一個使用自定義適配器的Spinners ListView。當我運行我的代碼時,除非屏幕上顯示的Spinners更多,否則一切正常。如果我向下滾動並顯示最後一個繡球,我可以按照預期使用它們,但只要向上滾動並且它們離開視圖,就會重置到選定項目總是第一個的位置,而不管Spinner中的項目是選擇。 。爲什麼是這樣?我認爲它與getView方法有關,但我不確定如何保存選擇,以便在它再次返回到視圖中時進行選擇。爲什麼我的Spinner在移出視圖時重置?

public class CustomPLNViewAdapter extends BaseAdapter{ 

private static ArrayList<ArrayList<String>> partLotNumbersArrayList; 
private static ArrayList<String> partNames; 

private LayoutInflater mInflater; 

private Context myContext; 

public CustomPLNViewAdapter(Context context, ArrayList<ArrayList<String>> results, ArrayList<String> parts){ 
    partLotNumbersArrayList = results; 
    partNames = parts; 
    mInflater = LayoutInflater.from(context); 
    myContext = context; 
} 
@Override 
public int getCount() { 
    return partLotNumbersArrayList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return partLotNumbersArrayList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.view_assembly_parts, null); 
     holder = new ViewHolder(); 
     holder.txtName = (TextView) convertView.findViewById(R.id.partName); 
     holder.spinner = (Spinner) convertView.findViewById(R.id.LotNumbers); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.txtName.setText(partNames.get(position));   

    ArrayAdapter<String> adp1=new ArrayAdapter<String>(myContext, android.R.layout.simple_list_item_1, partLotNumbersArrayList.get(position));   
    adp1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    //set the adapter to the spinnner 
    holder.spinner.setAdapter(adp1); 

    //if there is only one other part besides "" then set that as default part 
    if(partLotNumbersArrayList.get(position).size() == 2){ 
     holder.spinner.setSelection(1); 
    } 

    holder.spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      if(holder.spinner.getSelectedItem().toString() == ""){ 
       Log.v("Spinner", "spinner value is blank"); 
       ViewOrderlineAssemblyActivity.assembly.addPart(new Part((String)holder.txtName.getText(), "")); 
      }else{ 
       ViewOrderlineAssemblyActivity.assembly.addPart(new Part((String)holder.txtName.getText(), holder.spinner.getSelectedItem().toString())); 
       Log.v("OnItemSelected", (String)holder.txtName.getText() + " : "+ holder.spinner.getSelectedItem().toString()); 
      } 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 
      ViewOrderlineAssemblyActivity.assembly.addPart(new Part((String)holder.txtName.getText(), "")); 
      Log.v("OnNothingSelected", (String)holder.txtName.getText()); 
     } 

    }); 

    return convertView; 
} 

static class ViewHolder { 
    TextView txtName; 
    Spinner spinner; 
} 
} 

回答

0

ListView中的視圖旨在回收以限制它們佔用的內存量。創建的視圖數量等於屏幕上可見的列表項數量。所以,當一個列表項目被推出屏幕並出現一個新的時候,不再可見的那個被回收用於剛剛滾動到視圖中的項目。

您需要保存微調器的狀態(如果它已被用戶更改),並在您的getView()方法中恢復該狀態。您可以將狀態保存在一個簡單的保存微調器狀態的對象數組中(選定的值等)。然後在getView()中,您可以檢查是否爲該微調器保存了任何狀態(在其列表中的位置索引),如果存在,則從已保存狀態設置其值。

相關問題