Android 自动选择RecyclerView的位置并将其高亮显示
目前,我有一个“播放列表”的视频谁我可以改变到下一个位置(视频播放器) RecyclerView具有完整的ArrayList并滚动到下一个位置,如下所示:Android 自动选择RecyclerView的位置并将其高亮显示,android,scroll,android-recyclerview,adapter,highlight,Android,Scroll,Android Recyclerview,Adapter,Highlight,目前,我有一个“播放列表”的视频谁我可以改变到下一个位置(视频播放器) RecyclerView具有完整的ArrayList并滚动到下一个位置,如下所示: mLinearLayoutManager.scrollToPositionWithOffset(position, 10); 太好了!现在,我想自动选择(我不想点击这里…)当前位置并突出显示它 最终产品应如下所示: mLinearLayoutManager.scrollToPositionWithOffset(position, 10);
mLinearLayoutManager.scrollToPositionWithOffset(position, 10);
太好了!现在,我想自动选择(我不想点击这里…)当前位置并突出显示它
最终产品应如下所示:
mLinearLayoutManager.scrollToPositionWithOffset(position, 10);
每次我在媒体播放器上点击“下一步”,下一项(位置)就会滚动并突出显示背景
如何将位置传递给适配器,以了解高亮显示/更改背景的位置?记得。。。此任务不涉及点击,项目需要始终保持高亮显示,仅在选择下一个视频/项目/位置时更改
解决了的 对适配器进行少量更改以使其正常工作
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);
}
您需要稍微更改一下适配器。在适配器中编写一个
toggleSelection
函数,并将位置传递给该函数。在全局阵列中跟踪播放列表中项目的位置。这样,当播放歌曲时,您就知道它在RecyclerView
中的位置
我正在添加一个适配器示例。您可以自定义切换选择功能
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();
}
}
public类ToggleSelectionListAdapter扩展了RecyclerView.Adapter{
私有游标mCursor;
专用SparseBooleanArray selectedItems;
公共切换SelectionListAdapter(光标){
mCursor=光标;
selectedItems=newsparsebooleanarray();
}
公共无效切换选择(int pos){
if(选择editems.get(pos,false)){
选择编辑项。删除(pos);
}否则{
选择editems.put(pos,true);
}
变更项目(pos);
}
public int getSelectedItemCount(){
返回selectedItems.size();
}
公共选举(){
选择editems.clear();
notifyDataSetChanged();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公共视图持有者(最终视图项视图){
超级(项目视图);
//在此处初始化每行的项目
}
公共视图(内部位置){
试一试{
if(mCursor.isClosed())
返回;
mCursor.moveToPosition(位置);
//维护选中的项目列表,以便在单击或未单击该项目时可以有一个跟踪
if(checkedItems.contains(number)itemView.setBackgroundResource(R.drawable.background_选中);
else itemView.setBackgroundResource(R.drawable.background\u normal);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(checkedItems.contains(number)){
checkedItems.remove(编号);
}否则{
checkedItems.add(编号);
}
//获取应切换背景的项目的索引
int idx=mRecyclerView.getChildAdapterPosition(v);
切换选择(idx);
}
}
});
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
观点五;
v=LayoutInflater.from(parent.getContext()).flate(R.layout.list\u item\u行,parent,false);
视窗支架vh=新视窗支架(v);
返回vh;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
if(视图保持架的保持架实例){
视窗支架vh=(视窗支架)支架;
vh.bindView(位置);
}
}
@凌驾
public int getItemCount(){
if(mCursor==null){
返回0;
}
int n=mCursor.getCount();
返回n;
}
@凌驾
public int getItemViewType(int位置){
返回super.getItemViewType(位置);
}
同步的公共void swapCursor(光标){
mCursor=光标;
notifyDataSetChanged();
}
}
谢谢!这并不是我想要的答案……但它让我找到了正确的解决方案。很高兴知道这有帮助。@Reaz Murshed:我正在处理一个类似的列表,但我被卡住了,因为我的RecyclerView列表中的第一个项目在默认情况下总是高亮显示,但我只希望它在选中时高亮显示。关于如何修复的任何想法:请检查您问题的答案。希望这有帮助。很好的解决方案。我正在做一些类似的工作,但我被卡住了,因为我的RecyclerView列表中的第一个项目在默认情况下总是高亮显示,但我只希望它在选中时高亮显示。关于如何修复的任何想法:@AJW尝试初始化值为-1的highlightItem
,而不是0什么是holder.mMainView
?@MrNarendra这是旧问题,已经解决。是保存该行的主视图组。@Narendra先生使用-1值初始化解决了这个问题!干杯