ListView中的Android SeekBar使用标签

时间:2015-08-09 14:13:03

标签: android listview android-edittext seekbar listadapter

好吧,我有一个自定义列表视图中的seekBar,我在onChangeClickListener上使用setTag / getTag方法,就像建议的here in this question一样,并且工作正常。但当我向listView添加一个新元素时,新元素的搜索栏会获取先前位于其位置的元素的进度。

请注意,我的SeekBar sbAnalog更新了EditText etAnalogPosition,反之亦然

这是我的getView()代码:

    public View getView(final int position, View convertView, ViewGroup parent) {
            view = convertView;


            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.my_custom_list_layout, null);

                holder = new ViewHolder();
                holder.sbAnalog = (SeekBar) view.findViewById(R.id.sbAnalog);
                holder.etAnalogPosition = (EditText) view.findViewById(R.id.tvAnalogPosition);

                view.setTag(holder);

            }else{
                holder = (ViewHolder) view.getTag();
            }
            holder.sbAnalog.setTag(holder.etAnalogPosition);
            holder.etAnalogPosition.setTag(holder.sbAnalog);

            holder.sbAnalog.setMax(list.get(position).getMax());


                holder.sbAnalog.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                        EditText et = (EditText) seekBar.getTag();
                        et.setText(String.valueOf(i));
                        list.get(position).setPosition(i);

                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {

                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {

                    }
                });
            }
holder.etAnalogPosition.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                        if (i == EditorInfo.IME_ACTION_DONE) {
                            int value = 0;
                            try {
                                value = Integer.parseInt(textView.getText().toString());
                            } catch (NumberFormatException e) {
                                SeekBar sb = (SeekBar )textView.getTag();
                                value = sb.getProgress();
                            }
                            //if (value > list.get(position).getMax())
                            //value = list.get(position).getMax();
                            SeekBar sb = (SeekBar) textView.getTag();
                            sb.setProgress(value);
                            textView.clearFocus();

                            if (view != null) {
                                InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                            }

                        textView.setText(String.valueOf(sb.getProgress()));
                    }
                    return false;
                }
            });}

需要帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

我刚刚意识到解决的最佳方法是在代码中添加以下两行:

holder.sbAnalog.setProgress(list.get(position).getPosition());

holder.etAnalogPosition.setText(String.valueOf(list.get(position).getPosition()));

请注意,我列表中的每个元素都是我创建的自定义对象,其中一个getPosition()方法基本上返回了由setPosition()方法设置的seekBar元素位置。

因此,如果您遇到同样的问题,我建议您这样做,或者只是创建一个存储每个元素位置的arrayAdapter,这样您就可以setget就像我做getView()代码一样。

希望它有所帮助!