2015-08-09 3 views
0

Ну, у меня есть seekBar в пользовательском listview, и я использую метод setTag/getTag для моего onChangeClickListener, как и предлагалось here in this question и отлично работает. Но , когда я добавляю новый элемент в списокView, поисковый элемент нового элемента принимает прогресс элемента, который ранее находился на его позиции.Android SeekBar в 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; 
       } 
      });} 

Вам нужны помощь, спасибо.

ответ

0

Я просто понял, что лучший способ решить добавляет эти две строки в коде:

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

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

Заметим, что каждый элемент из моего списка является пользовательский объект, который я создал, который один имеет метод getPosition() который в основном возвращает позицию seekBar элемента, установленную методом setPosition().

Так что, если у Вас есть такая же проблема, я рекомендую вам сделать это таким образом, или просто создать arrayAdapter, который хранит позицию каждого элемента, так что вы сможете set и get так же, как я им мою getView() код.

Надеюсь, это поможет!