选定的微调器项目被微调器中的第一行替换
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;
}
关于在字段中存储 savedSearchName
和 btnDelete
,我猜是因为您想避免再次搜索它们。在那种情况下,我建议使用支架图案。请参阅以下 Google guide.
中的示例 在视图持有者中持有视图对象
我一直在研究一个微调器,它具有下拉菜单的自定义布局。这是我的问题,当我 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;
}
关于在字段中存储 savedSearchName
和 btnDelete
,我猜是因为您想避免再次搜索它们。在那种情况下,我建议使用支架图案。请参阅以下 Google guide.