在 RecyclerView 中突出显示所选项目 [英] Highlight selected item inside a RecyclerView
问题描述
我在 RecyclerView 中突出显示项目时遇到问题,类似于在 ListView 中设置所选项目.
I'm having trouble with highlighted an item within a RecyclerView, similar to setting the selected item in a ListView.
目前,我已经设置了 RecyclerView,有一个默认的 LayoutManager,并且有一个显示所有数据的适配器.我最近刚刚让 onClickListener()
工作(虽然我不确定它是否应该放在 onCreateViewHolder()
或 onBindViewHolder*(
代码>-不确定何时调用 onBindViewHolder()
.
At the moment, I've set up up the RecyclerView, have a default LayoutManager, and have an adapter which displays all the data. I've just recently got the onClickListener()
working (although I'm not sure if it should go in the onCreateViewHolder()
or onBindViewHolder*(
- not sure when onBindViewHolder()
is called).
我试过四处搜索,我得到的最接近的是 问题在这里.但是,我完全迷失在这个问题上.onClick()
方法在哪里(在适配器内部,在包含的活动/片段内部等?).viewHolderListener
是什么?getPosition()
来自什么,它究竟做了什么?从本质上讲,我对这个问题一无所知,这是迄今为止我能找到的最好的资源.
I've tried searching around, and the closest I've gotten is the question here. However, I'm completely lost in that question. Where is that onClick()
method (inside the adapter, inside the containing Activity/fragment, etc?). What is that viewHolderListener
? What is getPosition()
from and what does it do exactly? Essentially, I've gotten nowhere from that question, and it was the best resource I could find so far.
这是我当前设置 RecyclerView 的代码:
Here is my current code for setting up the RecyclerView:
// Sets up the main navigation
private void setupMainNav() {
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
mMainRecyclerNav.setHasFixedSize(true);
// use a linear layout manager
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mMainRecyclerNav.setLayoutManager(layoutManager);
// Create and set the adapter for this recyclerView
MainNavAdapter adapter = new MainNavAdapter(getActivity());
mMainRecyclerNav.setAdapter(adapter);
}
这是我当前的适配器代码:
Here is my current code for the adapter:
class MainNavAdapter extends RecyclerView.Adapter<MainNavAdapter.ViewHolder> {
Context mContext;
// Holds the titles of every row
String[] rowTitles;
// Default constructor
MainNavAdapter(Context context) {
this.mContext = context;
// Get the rowTitles - the necessary data for now - from resources
rowTitles = context.getResources().getStringArray(R.array.nav_items);
}
// Simple class that holds all the views that need to be reused
class ViewHolder extends RecyclerView.ViewHolder{
View parentView; // The view which holds all the other views
TextView rowTitle; // The title of this item
// Default constructor, itemView holds all the views that need to be saved
public ViewHolder(View itemView) {
super(itemView);
// Save the entire itemView, for setting listeners and usch later
this.parentView = itemView;
// Save the TextView- all that's supported at the moment
this.rowTitle = (TextView) itemView.findViewById(R.id.row_title);
}
}
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
// Create the view for this row
View row = LayoutInflater.from(mContext)
.inflate(R.layout.list_navmain_row, viewGroup, false);
// Create a new viewHolder which caches all the views that needs to be saved
ViewHolder viewHolder = new ViewHolder(row);
return viewHolder;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
viewHolder.rowTitle.setText(rowTitles[i]);
// TODO: Make a better workaround for passing in the position to the listener
final int position = i;
// Set a listener for this entire view
viewHolder.parentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "Clicked on row: " + position, Toast.LENGTH_SHORT).show();
}
});
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return rowTitles.length;
}
}
我将不胜感激.谢谢.
推荐答案
RecyclerView
不像 ListView
那样处理项目选择或状态.相反,您必须在视图持有者中手动处理此问题.
RecyclerView
does not handle item selection or states like a ListView
does. Instead you have to handle this manually in your view holder.
您可以做的第一件事是在您的 `ViewHolder 构造函数中将您的项目视图声明为可点击:
The first thing you can do is declare your item view as clickable, in your `ViewHolder constructor :
public ViewHolder(View itemView) {
super(itemView);
// Make this view clickable
itemView.setClickable(true);
// ...
}
然后,如果要突出显示选择,则必须跟踪适配器中选定的行(例如使用索引列表)和 onBindViewHolder 方法:
Then if you want to highlight the selection, you must keep track of the selected rows in your adapter (for example using a List of indices), and in your onBindViewHolder method :
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
// mark the view as selected:
viewHolder.parentview.setSelected(mSelectedRows.contains(i));
}
作为旁注,您应该在 onCreateViewHolder 而不是 onBindViewHolder 的父视图上设置 onClickListener.onBindViewHolder 方法会为同一个视图持有者多次调用,你将执行不必要的操作
As a side note you should set the onClickListener on your parent view in the onCreateViewHolder instead of the onBindViewHolder. The onBindViewHolder method will be called many times for the same view holder, and you'll perform more operations than necessary
这篇关于在 RecyclerView 中突出显示所选项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!