如何通过获取项目位置在recyclerView中聚焦/滚动到特定项目 [英] How to focus/scroll to a specific item in recyclerView by fetching item position
问题描述
我必须滚动到recyclerview中的特定项目.
I have to scroll to a specific item in a recyclerview.
首先,我需要通过与从活动传递到适配器的字符串匹配来获取项目的位置.然后将其聚焦到该项目的位置.
Firstly I need to fetch the position of the item by matching with a string which I pass from the activity to the adapter. then to focus to that item position.
例如,在适配器中有一个存储了 EventID 的TextView,我将一个字符串从activity传递到适配器,以使其与 EventID 匹配,然后获取该字符串项目位置,然后将焦点/滚动设置到该特定位置.我已经在适配器中定义了一种方法来获取项目的位置,但是我不知道如何从活动中调用它,因为它具有 viewholder 作为参数.
For example in the adapter there is a TextView which has EventID stored, I will pass a string from activity to adapter to match it with the EventID and then fetch that item position and set focus/scroll to that particular position. I have defined a method in adapter to fetch position of item but I don't know how to call it from the activity since it has viewholder as parameter.
我对如何实现 recyclerView.scrollToPosition(mSkipTo)
或实现此目标的其他方法感到困惑.在我的活动中如何称呼它.既然我是新手,请给出一个代码示例.
I'm confused about how to implement recyclerView.scrollToPosition(mSkipTo)
or something else to achieve this. How to call it in my activity. Kindly give a code example since I'm new to this.
public class EventsAdapter extends RecyclerView.Adapter<EventsAdapter.ViewHolder> {
private Context context;
private final List<EventsDataModel> eventsDataModels;
private static int currentPosition = 0;
public EventsAdapter(Context context) {
super();
this.context = context;
this.eventsDataModels = new ArrayList<EventsDataModel>();
}
public void updateModels(List<EventsDataModel> newModels) {
eventsDataModels.clear();
eventsDataModels.addAll(newModels);
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.event_card_new, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
final EventsDataModel dataAdapter = eventsDataModels.get(position);
......
......
viewHolder.EventID.setText(dataAdapter.getEventID());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (context instanceof EventsActivity) {
((EventsActivity) context).clickOnEventType(viewHolder.EventID.getText().toString());
}
}
});
}
//How to call this method from activity ? Since ViewHolder cannot be obtained from there
public int getItemPosition(ViewHolder viewHolder,String inEventID){
int itemPos=0;
if (viewHolder.EventID.getText().equals(inEventID)) {
itemPos = viewHolder.getAdapterPosition();
}
return itemPos;
}
@Override
public int getItemCount() {
return eventsDataModels.size();
}
}
推荐答案
将公共功能添加到适配器中.
Add public function into your adapter.
public class EventsAdapter extends RecyclerView.Adapter<EventsAdapter.ViewHolder> {
...
public int getItemPosition(String eventId) {
for (int i = 0; i < eventsDataModels.size(); i++) {
if (eventsDataModels.get(i).getEventID().equals(eventId)) {
return i;
}
}
return -1;
}
活动:
private void scrollToPosition() {
String eventId = "someId";
int position = adapter.getItemPosition(eventId);
if (position >= 0) {
recycler.scrollToPosition(position);
}
}
这篇关于如何通过获取项目位置在recyclerView中聚焦/滚动到特定项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!