【问题标题】:Auto select position of RecyclerView and highlight it自动选择 RecyclerView 的位置并高亮显示
【发布时间】:2016-08-27 13:54:03
【问题描述】:

目前我有一个视频“播放列表”,我可以将其更改为下一个位置(视频播放器)。

RecyclerView 有这个完整的 ArrayList 并像这样滚动到下一个位置:

mLinearLayoutManager.scrollToPositionWithOffset(position, 10);

完美!现在,我想自动选择(我不想点击这里...)当前位置并突出显示它。

最终产品应如下所示:

每次我在媒体播放器上点击下一个时,下一个项目(位置)都会滚动并突出显示背景。

如何将位置传递给适配器以了解要突出显示/更改背景的位置?请记住...此任务不涉及点击,并且该项目需要始终保持突出显示,只有在选择下一个视频/项目/位置时才会更改。


已解决

对适配器进行一些更改以使其工作

private int highlightItem = 0;

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

toggleSelection(position) 将在我的 Activity 中使用,我一直存储当前位置。

在那之后,我的适配器中的最终更改是:

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

【问题讨论】:

  • 不错的解决方案。我正在做类似的事情,但被卡住了,因为我的 RecyclerView 列表中的第一项总是默认突出显示,但我只希望它在被选中时突出显示。有关如何修复的任何想法:stackoverflow.com/questions/38818499/…
  • @AJW 尝试将 highlightItem 初始化为 -1,而不是 0
  • holder.mMainView 是什么?
  • @MrNarendra 这是旧的并且已经解决了。是持有该行的主视图组。
  • @Mr Narendra 初始化值为 -1 解决了这个问题!干杯。

标签: android scroll android-recyclerview adapter highlight


【解决方案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();
        }
    }

【讨论】:

  • 谢谢!这不是我正在寻找的确切答案......但它引导我找到正确的解决方案。
  • 很高兴知道这有帮助。 :)
  • @Reaz Murshed:我正在处理一个类似的列表,但我卡住了,因为我的 RecyclerView 列表中的第一项默认情况下总是突出显示,但我只希望它在被选中时突出显示。有关如何修复的任何想法:stackoverflow.com/questions/38818499/…
  • 请检查您的问题的答案。希望对您有所帮助。
猜你喜欢
  • 2016-10-22
  • 2020-12-12
  • 2015-09-24
  • 2012-04-16
  • 2019-02-22
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多