如何使用游标适配器将微调器与自定义布局一起使用?
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;
}
我的 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;
}