2013-05-14 2 views
0

У меня есть счетчик. Который я переопределил пользовательский dropview getview.
Я работаю в андроиде 2,2Spinner by arrayadapter действует «странно»

Проблемы заключается в том, что выбранное значение заменяются на «по умолчанию» (пустое поле), вставленное значение при повторном открытии селектора: изображения, чтобы объяснить ниже, и переопределяется код под ними:

Initial activity

Теперь нажав на блесну:

selection

Теперь нажатие грабит, а затем нажмите кнопку S передник снова

Missing robs

Dropdown переопределен метод:

@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, потому что вы могли бы быть рециркуляции View где видимость была ранее установлена ​​в GONE

+0

Спасибо за clearification, хотя до сих пор делает это, теперь не на «грабежах», а на других. –

+0

Я только заметил, что вы получаете «LayoutParams» из «indentationField», изменяя их, а затем снова устанавливая их. Это тоже не сработает, так как вы не можете получать оригинальные «LayoutParams», вы можете получить уже измененную версию. Вам нужно посмотреть, как вы все это делаете. –

+0

Хорошо, поэтому нет шаблона для зрителей для меня :) –

Смежные вопросы