2016-05-02 9 views
2

Derzeit habe ich eine "Playlist" von Videos, die ich auf die nächste Position (Video-Player) wechseln kann.Gelöst: Auto-Position von RecyclerView auswählen und markieren

Die RecyclerView hat diese voll Arraylist und blättern Sie zur nächsten Position wie folgt aus:

mLinearLayoutManager.scrollToPositionWithOffset(position, 10); 

Perfect! Jetzt möchte ich AUTO SELECT (ich möchte hier keine Klicks haben ...) die aktuelle Position markieren und markieren.

Das Endprodukt sollte wie folgt aussehen:

enter image description here

und jedes Mal, wenn ich als nächstes auf dem Media-Player treffen, wird im nächsten Punkt (Position) blättern und den Hintergrund hervorzuheben.

Wie übergebe ich die Position an den Adapter, um die Position zum Hervorheben/Ändern des Hintergrunds zu erfahren? Denken Sie daran, dass es in dieser Aufgabe keine Klicks gibt und dass das Element die ganze Zeit hervorgehoben bleiben muss und sich nur ändert, wenn das nächste Video/Element/Position ausgewählt wird.

UPDATE:

Nur wenige Änderungen auf dem Adapter, um es

private int highlightItem = 0; 

public void toggleSelection(int pos) { 
    this.highlightItem = pos; 
} 

toggleSelection(position) von meiner Aktivität, wo ich Speicherung all die aktuelle Position der Zeit verwendet wird funktionieren.

Danach wird die letzte Veränderung in meinem Adapter war:

if (position == highlightItem) { 
    holder.mMainView.setSelected(true); 
} else { 
    holder.mMainView.setSelected(false); 
} 

Danke, dass ich zur richtigen Lösung führt und hier werde ich das Update für alle mit dem gleichen Problem halten.

+0

nette Lösung. Ich arbeite an etwas ähnlichem, aber ich stecke fest, weil das erste Element in meiner RecyclerView-Liste immer standardmäßig markiert ist, aber ich möchte nur, dass es markiert ist, wenn es ausgewählt ist. Irgendwelche Ideen zur Behebung: http://stackoverflow.com/questions/38818499/android-recyclerview-why-is-first-item-in-list-ready-selected – AJW

+1

@AJW versuche initialisieren 'highlightItem' mit Wert von - 1, statt 0 – NarendraJi

+0

Was ist 'holder.mMainView'? – NarendraJi

Antwort

1

Sie müssen Ihren Adapter ein wenig ändern. Schreiben Sie eine Funktion in Ihren Adapter und übergeben Sie die Position an die Funktion. Verfolgen Sie die Position der Elemente in Ihrer Wiedergabeliste in einem globalen Array. Wenn Sie also ein Lied spielen, kennen Sie seine Position in der RecyclerView.

Ich füge ein Beispiel für einen Adapter hinzu. Sie können Ihre toggleSelection Funktion anpassen lassen.

public class ToggleSelectionListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

     private Cursor mCursor; 
     private SparseBooleanArray selectedItems; 

     public ToggleSelectionListAdapter(Cursor cursor) { 
      mCursor = cursor; 
      selectedItems = new SparseBooleanArray(); 
     } 

     public void toggleSelection(int pos) { 
      if (selectedItems.get(pos, false)) { 
       selectedItems.delete(pos); 
      } else { 
       selectedItems.put(pos, true); 
      } 
      notifyItemChanged(pos); 
     } 

     public int getSelectedItemCount() { 
      return selectedItems.size(); 
     } 

     public void clearSelections() { 
      selectedItems.clear(); 
      notifyDataSetChanged(); 
     } 

     public class ViewHolder extends RecyclerView.ViewHolder { 

      public ViewHolder(final View itemView) { 
       super(itemView); 

       // Initialize your items of each row here 
      } 

      public void bindView(int pos) { 
       try { 
        if (mCursor.isClosed()) 
         return; 

        mCursor.moveToPosition(pos); 

        // Maintain a checked item list so that you can have a track if the item is clicked or not 
        if (checkedItems.contains(number) itemView.setBackgroundResource(R.drawable.background_selected); 
        else itemView.setBackgroundResource(R.drawable.background_normal); 

        itemView.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
            if (checkedItems.contains(number)) { 
             checkedItems.remove(number); 
            } else { 
             checkedItems.add(number); 
            } 

           // Get the index of which item should toggle the background 
           int idx = mRecyclerView.getChildAdapterPosition(v); 
           toggleSelection(idx); 
          } 
         } 
        }); 
      } 
     } 


     @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      View v; 

      v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_row, parent, false); 

      ViewHolder vh = new ViewHolder(v); 

      return vh; 
     } 

     @Override 
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

      if (holder instanceof ViewHolder) { 
       ViewHolder vh = (ViewHolder) holder; 

       vh.bindView(position); 

      } 
     } 

     @Override 
     public int getItemCount() { 

      if (mCursor == null) { 
       return 0; 
      } 

      int n = mCursor.getCount(); 
      return n; 
     } 

     @Override 
     public int getItemViewType(int position) { 
      return super.getItemViewType(position); 
     } 

     synchronized public void swapCursor(Cursor cursor) { 
      mCursor = cursor; 
      notifyDataSetChanged(); 
     } 
    } 
+1

Danke! Das war nicht die genaue Antwort, die ich suchte ... aber es führt mich zur richtigen Lösung. –

+0

Gut zu wissen, dass geholfen hat. :) –

+0

@Reaz Murshed: Ich arbeite an einer ähnlichen Liste, aber stecken geblieben, weil das erste Element in meiner RecyclerView-Liste immer standardmäßig markiert ist, aber ich möchte nur hervorgehoben, wenn es ausgewählt ist. Irgendwelche Ideen, wie man repariert: http: // stackoverflow.com/questions/38818499/android-recyclerview-why-is-first-item-in-list-bereits ausgewählt – AJW