【问题标题】:Android: Changing one number picker cause other number picker to changeAndroid:更改一个数字选择器会导致其他数字选择器更改
【发布时间】: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


【解决方案1】:

每次都需要设置 numberpicker 默认值

    holder = new ViewHolder();
    holder.name = (TextView) listItem.findViewById(R.id.organName);
    holder.numberPicker = (NumberPicker) ;
    holder.numberPicker.setValue(defaultValue);//like this

【讨论】:

    【解决方案2】:

    尝试使用如下接口将点击事件处理到适配器中 例如将一个接口变成适配器类..

        private onItemClick onItemClick;
    
    public void setOnItemClick(DisplayAllData.onItemClick onItemClick) {
        this.onItemClick = onItemClick;
    }
    
    public interface onItemClick{
        void onItemSelected(int position); // pass your data 
    }
    

    在 getView() 方法中,例如 number listner 将所有逻辑代码调用到活动或片段中。

            holder.mTvName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onItemClick.onItemSelected(position);
            }
        });
    

    在适配器设置为 listview 或 recyclerview 之后的活动或片段中 适配器不为空,然后在下面的代码中调用..

    allDataAdapter.setOnItemClick(new DisplayAllData.onItemClick() {
                    @Override
                    public void onItemSelected(int position) {
                        // here called all logical part
                        allDataAdapter.notifyDataSetChanged();
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2023-02-22
      • 2015-03-31
      • 2015-10-21
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多