选定的微调器项目被微调器中的第一行替换

Selected Spinner Item getting replaced by First row in the spinner

我一直在研究一个微调器,它具有下拉菜单的自定义布局。这是我的问题,当我 select 时,比方说下拉列表中的第二项,它得到 selected 并且下拉列表关闭。当我重新打开下拉菜单时,第一行保持不变,但第二行被重命名为第一行。但它告诉我,当我在控制台中打印 log.d 时,position:2 被 selected.

这是我的代码,

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        TextView textView = (TextView) convertView.inflate(getContext(), android.R.layout.simple_spinner_item, null);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
        textView.setTextColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.blue));
        if(list.getIsRecent()){
            textView.setText("Most Recent ");
        } else {
            textView.setText(list.get(position).getName());
        }
        return textView;
    }

    public View getCustomView(final int position, View convertView, ViewGroup parent) {
        boolean isRecent;
        isRecent = list.get(position).getIsRecent();
        if (convertView == null) {
                convertView = inflater.inflate(R.layout.custom_spinner_layout, parent, false);
                savedSearchName = (TextView) convertView
                        .findViewById(R.id.custom_spinner_layout_text_view);


            btnDelete = (ImageButton) convertView
                        .findViewById(R.id.custom_spinner_layout_button);

            relativeLayoutContainer = (RelativeLayout) convertView.findViewById(R.id.relativeLayout_item_name_container);
            relativeLayoutContainer.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG,"relativeLayoutContainer: setOnClickListener: position"+position);
                    Method method = null;
                    if(mSavedSearchCriteriaSpinner != null) {
                        mSavedSearchCriteriaSpinner.setSelection(position);
                        try {
                            method = Spinner.class.getDeclaredMethod("onDetachedFromWindow");
                            method.setAccessible(true);
                            method.invoke(mSavedSearchCriteriaSpinner);
                        } catch (Exception  e) {
                            e.printStackTrace();
                        }
                    }
                }
            });


            if(isRecent){
                btnDelete.setVisibility(View.INVISIBLE);
                savedSearchName.setText(list.get(position).getName() + "MOSTRECENT");
            } else {
                savedSearchName.setText(list.get(position).getName());
                btnDelete.setVisibility(View.VISIBLE);

                btnDelete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //AlertDialog
                });
            }

        }
        return convertView;
    }

截图: 初始微调器

微调器下拉菜单

位置 1 select编辑:Qwerty

重新打开下拉菜单

不,这不是作业题。

getView() 中,您使用的 convertView 有误。这可以是 null 或需要回收的旧视图。如果它是 null,您必须像现在一样扩充新视图。如果不是,这是一个需要回收的旧项目(即你需要修改文本,你甚至不需要重新设置文本大小和颜色):

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = convertView;
        if (convertView == null) {
            LayoutInflater li = LayoutInflater.from(parent);
            textView = (TextView) li.inflate(getContext(), android.R.layout.simple_spinner_item, null);
            textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
            textView.setTextColor(ContextCompat.getColor(getActivity().getApplicationContext(), R.color.blue));
        }
        if(list.getIsRecent()){
            textView.setText("Most Recent ");
        } else {
            textView.setText(list.get(position).getName());
        }
        return textView;
    }

此外,getCustomView 将 btnDelete 和 savedSearchName 存储在您对象的字段中,这可能会弄乱旧内容。此外,始终更新 convertView(现在,如果 convertView 不为 null,则不会更新它):

public View getCustomView(final int position, View convertView, ViewGroup parent) {
    boolean isRecent;
    isRecent = list.get(position).getIsRecent();
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.custom_spinner_layout, parent, false);
    }

    TextView savedSearchName = (TextView) convertView.findViewById(R.id.custom_spinner_layout_text_view);


    ImageButton btnDelete = (ImageButton) convertView.findViewById(R.id.custom_spinner_layout_button);

    RelativeLayout relativeLayoutContainer = (RelativeLayout) convertView.findViewById(R.id.relativeLayout_item_name_container);
    relativeLayoutContainer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG,"relativeLayoutContainer: setOnClickListener: position"+position);
            Method method = null;
            if(mSavedSearchCriteriaSpinner != null) {
                mSavedSearchCriteriaSpinner.setSelection(position);
                try {
                    method = Spinner.class.getDeclaredMethod("onDetachedFromWindow");
                    method.setAccessible(true);
                    method.invoke(mSavedSearchCriteriaSpinner);
                } catch (Exception  e) {
                    e.printStackTrace();
                }
            }
        }
    });


    if(isRecent){
        btnDelete.setVisibility(View.INVISIBLE);
        savedSearchName.setText(list.get(position).getName() + "MOSTRECENT");
    } else {
        savedSearchName.setText(list.get(position).getName());
        btnDelete.setVisibility(View.VISIBLE);

        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    //AlertDialog
            });
    }

    return convertView;
}

关于在字段中存储 savedSearchNamebtnDelete,我猜是因为您想避免再次搜索它们。在那种情况下,我建议使用支架图案。请参阅以下 Google guide.

中的示例 在视图持有者中持有视图对象