2017-01-05 1 views
1

schnelle Frage, da meine andere Frage nie beantwortet wurde. Ich habe eine RecyclerView, die mit einem SeekBar für jeden Artikel (CardView) bestückt wird. Ich würde gerne wissen, der beste Weg, um diese SeekBar Position zu bekommen.Position der Suchleiste aus der Recycler-Ansicht?

Mit anderen Worten, wie würde ich in der Lage sein, die erste Suchleiste von der zweiten Suchleiste zu unterscheiden, wenn es zwei Elemente in der Recycleransicht gibt, die jeweils ihre eigene SeekBar enthalten?

Auch, wenn dies hilft, ist der Hörer für sagte SeekBar in meinem Adapter.

Beispiel des Codes auf Anfrage:

class ViewHolder extends RecyclerView.ViewHolder { 
    private TextView mName, mUsername, mPercent; 
    private SeekBar mSeekBar; 

    ViewHolder(View itemView) { 
     super(itemView); 
     mName = (TextView) itemView.findViewById(R.id.name_view_members); 
     mUsername = (TextView) itemView.findViewById(R.id.username_view_members); 
     mPercent = (TextView) itemView.findViewById(R.id.percent_text); 
     mSeekBar = (SeekBar) itemView.findViewById(R.id.percent_seekbar); 
    } 
} 
@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    GroupMembers individual = mMembers.get(position); 
    holder.mName.setText(individual.getName()); 
    holder.mUsername.setText(individual.getUsername()); 

    //SeekBar Listener 
    holder.mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

      //Find out which SeekBar triggered the event 
      int which = whichIsIt(seekBar.getId(), progress); 

      //Stored progress (where is it at) 
      int storedProgress = mAllProgress.get(which); 

      /**Two cases can occur: User goes left or right with the thumb. 
      * If RIGHT, we must check how much he's allowed to go in that 
      * direction (based on other seekbars), and stop him before it's 
      * too late. If LEFT, free up the space to allow the other seekbars. 
      **/ 
      if (progress > storedProgress) { 
       //How much remains based on all seekbars. 
       int remaining = remaining(); 
       //If progress 100%, don't let user move. (overextend) 
       if (remaining == 0) { 
        seekBar.setProgress(storedProgress); 
       } else { 
        //Progress available, check the availability of others, 
        //and let the user move as long as it's below 100% total. 
        if (storedProgress + remaining >= progress) { 
         mAllProgress.set(which, progress); 
        } else { 
         mAllProgress.set(which, storedProgress + remaining); 
        } 
       } 
      } else if (progress <= storedProgress) { 
       mAllProgress.set(which, progress); 
      } 
     } 

     private int whichIsIt(int id, int progress) { 
      holder.mPercent.setText(" " + progress + "%"); 
      return R.id.percent_seekbar; 
     } 

     private int remaining() { 
      int remaining = TOTAL_AMOUNT; 
      for (int i = 0; i < mAllProgress.size(); i++) { 
       remaining -= mAllProgress.get(i); 
      } 
      if (remaining >= 100) { 
       remaining = 100; 
      } else if (remaining <= 0) { 
       remaining = 0; 
      } 
      return remaining; 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 
    }); 

Verfahren whichIsIt sollte bestimmen, welche SeekBar des RecyclerView ausgelöst wird.

+0

posten Sie Ihre Beispielcode – raj

+0

@raj ich bearbeitet/hinzugefügt den obigen Beispielcode. Jede Hilfe würde sehr geschätzt werden ... Ich stecke seit einer ganzen Weile fest. –

+0

@AndrewMagana Ich habe mehrere Suchleisten und wenn ich Scroll vorhergehende es Audio ändert, wie man es verhindert.? –

Antwort

1

Sie können einen Tag für jede seekBar mit der Position in dem seekBar.setTag(holderPosition); Adapterset So in der Methode

onProgressChanged(SeekBar seekBar,...) Sie seekBar.getTag() tun. Auf diese Weise können Sie Ihre Daten an der richtigen Position ändern.

S.S. Wenn OnSeekBarChangeListener für alle seekBars identisch ist, können Sie ein privates Feld damit erstellen. ;)

+0

Das brachte mich einen Schritt näher, und es beantwortet technisch die Frage, die ich hatte. Schnelle Frage ... wenn ich 'seekBar.getTag()' in meinem 'storedProcess' verwende, gibt es jedes Mal einen Fehler, wenn ich versuche, eine andere Suchleiste als die erste Position zu verschieben. Warum ist das? Würde 'getTag' nicht einfach die berührte Position erfassen, da dies das Tag ist, das ich gesetzt habe (Halterposition)? –

+1

Was ist der Fehler? – Sanf0rd

+0

Sorry mein Fehler, es war nicht relevant für den getTag. Danke für Ihre Hilfe! –

Verwandte Themen