2013-05-14 25 views
0

我有一個微調。我已經重寫了自定義下拉getview。
我在機器人2.2由arrayadapter微調行爲「怪異」

問題工作的是,所選擇的值得到由「默認」(空字段)重新打開該選擇器時插入的值替代:圖像在下面解釋,並且它們下面的重寫代碼:

Initial activity

現在按微調:

selection

現在迫切搶劫,然後按下s平納再次

Missing robs

下拉重寫方法:

@Override 
    public View getDropDownView(int position, View convertView, 
      ViewGroup parent) { 
     View v; 
     ViewHolder holder; 
     if (convertView == null) { 
      v = View.inflate(ctx, R.layout.fav_spinner_item, null); 
      holder = new ViewHolder(); 
      holder.indentationField = (ImageView) v 
        .findViewById(R.id.indent); 
      holder.nameField = (TextView) v.findViewById(R.id.name); 
      holder.levelCount = mList.get(position).getTier() != -1 ? mList 
        .get(position).getTier() : 0; 
      holder.nameField.setText(mList.get(position).getDisplayName()); 
      if (holder.levelCount == 0) { 
       holder.indentationField.setVisibility(View.GONE); 
      } else { 
       RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.indentationField.getLayoutParams(); 
       params.setMargins(params.leftMargin+((params.leftMargin+15)*holder.levelCount), params.topMargin, params.rightMargin, params.bottomMargin); 
       holder.indentationField.setLayoutParams(params); 
      } 
      v.setTag(holder); 
     } else { 
      v = convertView; 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     return v; 
    } 

回答

1

您沒有使用ViewHolder模式正常。由於getDropDownView()可以要求任何項指數,並且可以通過任何回收View,你需要正確地重置所有每次動態數據。就像這樣:

@Override 
public View getDropDownView(int position, View convertView, 
     ViewGroup parent) { 
    View v; 
    ViewHolder holder; 
    if (convertView == null) { 
     v = View.inflate(ctx, R.layout.fav_spinner_item, null); 
     holder = new ViewHolder(); 
     holder.indentationField = (ImageView) v 
       .findViewById(R.id.indent); 
     holder.nameField = (TextView) v.findViewById(R.id.name); 
     v.setTag(holder); 
    } else { 
     v = convertView; 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    // The rest of this is dynamic data, based on the item position 
    holder.levelCount = mList.get(position).getTier() != -1 ? mList 
       .get(position).getTier() : 0; 
    holder.nameField.setText(mList.get(position).getDisplayName()); 
    if (holder.levelCount == 0) { 
     holder.indentationField.setVisibility(View.GONE); 
    } else { 
     RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.indentationField.getLayoutParams(); 
     params.setMargins(params.leftMargin+((params.leftMargin+15)*holder.levelCount), params.topMargin, params.rightMargin, params.bottomMargin); 
     holder.indentationField.setLayoutParams(params); 
     holder.indentationField.setVisibility(View.VISIBLE); 
    } 
    return v; 
} 

還要注意行我加入的indentationField能見度恢復到VISIBLE,因爲你可能會被回收,其中知名度之前設置爲GONE

+0

感謝clearification一個View,雖然它仍然現在不是「robs」,而是其他的 – 2013-05-14 10:52:30

+0

我剛剛注意到,你從'indentationField'獲得'LayoutParams',修改它們,然後再次設置它們。這也不會正確工作,因爲你可能沒有得到原始的'LayoutParams',你可能會得到一個已經修改過的版本。你需要看看你是如何做到這一切。 – 2013-05-14 17:14:40

+0

好吧,所以我沒有viewholder模式:) – 2013-05-16 07:22:20