2016-05-02 11 views
2

現在、私は次のポジション(ビデオプレーヤー)に変更できるビデオの「プレイリスト」を持っています。解決済み:RecyclerViewの位置を自動選択してハイライト表示

RecyclerViewは、このフルのArrayListを持っており、このような次の位置にスクロール:

mLinearLayoutManager.scrollToPositionWithOffset(position, 10); 

パーフェクト!今、私はAUTO SELECT(ここではクリックしたくない...)を現在の位置にしてハイライトしたいと思います。

最終製品は次のようになります。

enter image description here

と私はメディアプレーヤーの次ヒットするたびに、次の項目(位置)は、背景をスクロールして強調表示されます。

バックグラウンドをハイライト/変更する位置を知るためにポジションをアダプタに渡すにはどうすればよいですか?覚えておいてください...このタスクにはクリックが含まれておらず、アイテムは常にハイライトされている必要があります。次のビデオ/アイテム/ポジションが選択されたときにのみ変更されます。

UPDATE:それは

private int highlightItem = 0; 

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

toggleSelection(position)を動作させるためにアダプタ上の

いくつかの変更は、現在の位置に私の活動どこストレージからすべての時間を使用さ​​れます。正解に私を導くための

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

おかげで、ここで私は同じ問題を持つすべての人のために更新しておこう:

はその後、私のアダプタで、最終的な変更でした。

+0

素晴らしい解決策です。私はRecyclerViewのリストの最初の項目が常にデフォルトで強調表示されているので、類似した作業をしていますが、選択されていれば強調表示したいだけです。どのように修正するためのアイデア:http://stackoverflow.com/questions/38818499/android-recyclerview-why-is-first-item-in-list-already-selected – AJW

+1

@AJWは、値を持つ 'highlightItem'を初期化しようとします。 1、0の代わりに – NarendraJi

+0

'holder.mMainView'とは何ですか? – NarendraJi

答えて

1

アダプタを少し変更する必要があります。 toggleSelection関数をアダプタに記述し、その位置を関数に渡します。あなたのプレイリスト内のアイテムの位置のトラックをグローバル配列に保持します。そのため、曲が演奏されるときには、RecyclerViewの位置がわかります。

アダプターの例を追加します。 toggleSelection機能をカスタマイズすることができます。

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

ありがとう!それは私が探していた正確な答えではありませんでしたが、それは私を正しい解決に導きます。 –

+0

助けてくれたことを嬉しく思っています。 :) –

+0

@Reaz Murshed:私は同様のリストに取り組んでいますが、RecyclerViewリストの最初の項目は常にデフォルトでハイライトされていますが、選択されていればハイライト表示されます。修正方法に関するアイデア:http:// stackoverflow。com/questions/38818499/android-recyclerview-リスト内の最初のアイテムが既に選択済み – AJW

関連する問題