如何使用游标适配器将微调器与自定义布局一起使用?

How to use a spinner with custom layouts using a cursor adapter?

我的 objective 是将工作微调器(通过光标适配器填充)转换为具有交替背景。类似于:-

目前我有这个,一切正常:-

这是游标适配器中的相关工作代码(即带有普通下拉菜单):-

@Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        return LayoutInflater.from(context).inflate(R.layout.activity_aisle_shop_list_selector, parent, false);
    }
    @Override
    public void bindView(View view,Context context, Cursor cursor) {
        determineViewBeingProcessed(view,"BindV",-1);

        TextView shopname = (TextView) view.findViewById(R.id.aaslstv01);
        shopname.setText(cursor.getString(shops_shopname_offset));

    }

我尝试添加对 getDropDownView 的覆盖(代码如下)。我得到了我想要的交替行颜色,但下拉视图是空白的。但是,如果我在选择器外部单击,它们就会填充数据(因此我如何设法获得如上所示的我想要的屏幕截图)。选择设置正确的项目。

如果我在展开布局后删除 return,则下拉视图会填充但包含来自其他行的数据(但是,选择会选择正确的项目)

public View getDropDownView(int position, View convertview, ViewGroup parent) {
        View v = convertview;
        determineViewBeingProcessed(v,"GetDDV",position);
        if( v == null) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_aisle_shop_list_entry, parent, false);
            return v;
        }
        Context context = v.getContext();

        TextView shopname = (TextView) v.findViewById(R.id.aasletv01);

        shopname.setText(getCursor().getString(shops_shopname_offset));

        if(position % 2 == 0) {
            v.setBackgroundColor(ContextCompat.getColor(context,R.color.colorlistviewroweven));
        } else {
            v.setBackgroundColor(ContextCompat.getColor(context,R.color.colorlistviewrowodd));
        }
        return v;
    }

线索是我只是想得不够认真。问题是光标在错误的位置,因为光标需要通过 getCursor() 获取。

此外,膨胀后的return为时过早(已被注释掉)。

在从游标访问数据之前添加 getCursor().moveToPosition(position); 可解决问题。

或者(也许更正确,对于一种方法是否比另一种方法更正确的评论表示赞赏)。添加:-

    Cursor cursor = getCursor();
    cursor.moveToPosition(position);

然后将后续的 getCursor() 替换为 cursor 非强制性 )也有效。

所以 getDropDownView 方法的最终代码可以是:-

public View getDropDownView(int position, View convertview, ViewGroup parent) {
        View v = convertview;
        determineViewBeingProcessed(v,"GetDDV",position);
        if( v == null) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_aisle_shop_list_entry, parent, false);
            //return v;
        }
        Context context = v.getContext();
        Cursor cursor = getCursor();
        cursor.moveToPosition(position);


        TextView shopname = (TextView) v.findViewById(R.id.aasletv01);

        shopname.setText(cursor.getString(shops_shopname_offset));

        if(position % 2 == 0) {
            v.setBackgroundColor(ContextCompat.getColor(context,R.color.colorlistviewroweven));
        } else {
            v.setBackgroundColor(ContextCompat.getColor(context,R.color.colorlistviewrowodd));
        }
        return v;
    }