如何通过获取项目位置在recyclerView中聚焦/滚动到特定项目 [英] How to focus/scroll to a specific item in recyclerView by fetching item position

查看:67
本文介绍了如何通过获取项目位置在recyclerView中聚焦/滚动到特定项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须滚动到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆