0

私はスピナーを持っています。カスタムドロップダウンgetviewをオーバーライドしました。
私はアンドロイド2.2で働いています

問題は、セレクターを再度開くと、選択された値が「デフォルト」(空のフィールド) に挿入された値に置き換えられることです: 以下で説明する画像と、その下のオーバーライドされたコード:

初期活動

スピナーを押すと:

選択

ロブを押してから、もう一度スピナーを押します

行方不明のロブ

ドロップダウンのオーバーライドされたメソッド:

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

1 に答える 1

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をリセットするために追加した行に注意してくださいVISIBLEViewGONE

于 2013-05-14T10:20:46.360 に答える