【发布时间】:2018-11-19 06:30:00
【问题描述】:
我创建了一个列表视图。列表视图中的每个项目都有两个 UI 元素。一个是文本视图,另一个是数字选择器。现在的问题是,如果我点击第一个数字选择器来更改值,第四个也会改变,反之亦然。这是我的getview函数
private class ViewHolder {
public TextView name;
public NumberPicker numberPicker;
public CustomListener listener;
}
public View getView(final int position, @Nullable View convertView, @NonNull final ViewGroup parent) {
ViewHolder holder;
View listItem = convertView;
currentCell=getItem(position);
currentCell.setPosition(position);
if (listItem == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
listItem = inflater.inflate(R.layout.organ_item, parent, false);
}
holder = new ViewHolder();
holder.name = (TextView) listItem.findViewById(R.id.organName);
holder.numberPicker = (NumberPicker)
listItem.findViewById(R.id.numberPicker);
holder.numberPicker.setMinValue(1);
holder.numberPicker.setMaxValue(10);
holder.numberPicker.setOnValueChangedListener(holder.listener);
holder.numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
currentCell=getItem(position);
View parentRow = (View) picker.getParent();
ListView mListView=(ListView)parentRow.getParent().getParent();
ConstraintLayout constraintLayoutView = (ConstraintLayout) mListView.getChildAt(currentCell.getPosition());
RelativeLayout relativeLayout = (RelativeLayout)constraintLayoutView.getChildAt(0);
NumberPicker p = (NumberPicker) relativeLayout.getChildAt(1);
if(position==currentCell.getPosition())
{
p.setValue(newVal);
}
else
{
p.setValue(oldVal);
}
}
});
//Set the name
TextView organName = (TextView)listItem.findViewById(R.id.organName);
organName.setText(QuickMeditationScreenInfo.getInstance().getScreenNameFromIndex(currentCell.getOrgan()));
return listItem;
}
此外,即使我注释掉 onValueChangeListener 也会发生相同的行为,我认为这是列表中数字选择器的默认行为。我已经花了几个小时,但无法找出解决方案。我也调试过代码,当我改变一个值时,调试器只进入一次 onValueChange 代码。
【问题讨论】:
-
您的问题似乎类似于在复选框或编辑文本等列表项中有可编辑字段时面临的问题,并且有很多可用的解决方案。您可以在这里尝试相同的方法
标签: java android android-listview numberpicker