Android 应用搜索筛选器后如何获取recyclerView的正确位置

Android 应用搜索筛选器后如何获取recyclerView的正确位置,android,android-recyclerview,searchview,Android,Android Recyclerview,Searchview,我已经实现了一个recyclerView,它从REST方法填充JSON数据。我还在工具栏上添加了一个searchView,根据searchView中输入的数据过滤recyclerview。现在我面临一个问题,在输入搜索参数后,单击recyclerview中的一个项目,它总是返回列表中由rest方法填充的第一个元素 Adapter.java private Context context; private LayoutInflater inflater; private List<Retai

我已经实现了一个
recyclerView
,它从
REST
方法填充
JSON
数据。我还在工具栏上添加了一个
searchView
,根据
searchView
中输入的数据过滤
recyclerview
。现在我面临一个问题,在输入搜索参数后,单击
recyclerview
中的一个项目,它总是返回列表中由rest方法填充的第一个元素

Adapter.java

private Context context;
private LayoutInflater inflater;
private List<RetailerOfferPOJO> data;
private static ClickListener clickListener;

public RetailerOfferAdapter(Context context, List<RetailerOfferPOJO> data) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.retailer_offer_adapter, parent, false);
    MyHolder holder = new MyHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    MyHolder myHolder = (MyHolder)holder;
    RetailerOfferPOJO current = data.get(position);
    //myHolder.lblID.setText(current.getsID());
    myHolder.lblOfferName.setText(current.getsOfferName());
    myHolder.lblDescription.setText(current.getsDescription());
    myHolder.lblPrice.setText(current.getsPrice());
}

@Override
public int getItemCount() {
    return data.size();
}

/**
 * Search Filter method for RecyclerView
 * @param searchModels
 */
public void setFilter(List<RetailerOfferPOJO> searchModels) {
    data = new ArrayList<>();
    data.addAll(searchModels);
    notifyDataSetChanged();
}

public static class MyHolder extends RecyclerView.ViewHolder  implements View.OnClickListener, View.OnLongClickListener{

    TextView lblID;
    TextView lblOfferName;
    TextView lblDescription;
    TextView lblPrice;

    // create constructor to get widget reference
    public MyHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        // lblID = (TextView) itemView.findViewById(R.id.lblID);
        lblOfferName = (TextView) itemView.findViewById(R.id.lblOfferName);
        lblDescription = (TextView) itemView.findViewById(R.id.lblDescription);
        lblPrice = (TextView) itemView.findViewById(R.id.lblPrice);

    }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    final MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            final List<RetailerOfferPOJO> filteredModelList = filter(mRetailerOffers, newText);
            if (!filteredModelList.isEmpty()) {
                mAdapter.setFilter(filteredModelList);
            }

            return true;
        }

    });




/**
 * Filter method for RecyclerView
 *
 * @param models
 * @param query -> data entered by the user as search parameter
 * @return
 */
private List<RetailerOfferPOJO> filter(List<RetailerOfferPOJO> models, String query) {

    //@param query -> the data entered by user is taken and converted to lowe case
    query = query.toLowerCase();

    final List<RetailerOfferPOJO> filteredModelList = new ArrayList<>();
    for (RetailerOfferPOJO model : models) {
        // the data that is populated in the RecyclerView is converted to lower case
        //full name and designation is attached to model class so that when the user searches
        //on either of them the recycler view displays data accordingly
        final String text = model.getsOfferName().toLowerCase();
        final String text1 = model.getsDescription().toLowerCase();
        if (text.contains(query)) {
            //check if the text in the recycler view contains the data entered by the user
            // and then update the list
            filteredModelList.add(model);
            mAdapter.notifyDataSetChanged();
        } else if (text1.contains(query)) {
            filteredModelList.add(model);
        }

    }
   // mAdapter.notifyDataSetChanged();
    return filteredModelList;
}
私有上下文;
私人充气机;
私人名单数据;
私有静态ClickListener ClickListener;
public RetailerOfferadPter(上下文、列表数据){
this.context=上下文;
充气器=充气器。从(上下文);
这个数据=数据;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=充气机。充气(R.layout.retailer\u offer\u适配器,父项,false);
MyHolder=新的MyHolder(视图);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
我的持有人我的持有人=(我的持有人)持有人;
RetailerOfferPOJO当前=data.get(位置);
//myHolder.lblID.setText(current.getsID());
myHolder.lblOfferName.setText(current.getsOfferName());
myHolder.lblDescription.setText(current.getsDescription());
myHolder.lblPrice.setText(current.getsPrice());
}
@凌驾
public int getItemCount(){
返回data.size();
}
/**
*RecyclerView的搜索筛选器方法
*@param searchModels
*/
公共void setFilter(列出搜索模型){
数据=新的ArrayList();
data.addAll(searchModels);
notifyDataSetChanged();
}
公共静态类MyHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener、View.OnLongClickListener{
文本视图lblID;
文本视图lblOfferName;
文本视图LBL描述;
文本视图lblPrice;
//创建构造函数以获取小部件引用
公共MyHolder(查看项目视图){
超级(项目视图);
setOnClickListener(这个);
setOnLongClickListener(此);
//lblID=(TextView)itemView.findViewById(R.id.lblID);
lblOfferName=(TextView)itemView.findViewById(R.id.lblOfferName);
lblDescription=(TextView)itemView.findViewById(R.id.lblDescription);
lblPrice=(TextView)itemView.findViewById(R.id.lblPrice);
}
MainActivity.java

private Context context;
private LayoutInflater inflater;
private List<RetailerOfferPOJO> data;
private static ClickListener clickListener;

public RetailerOfferAdapter(Context context, List<RetailerOfferPOJO> data) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = data;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.retailer_offer_adapter, parent, false);
    MyHolder holder = new MyHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    MyHolder myHolder = (MyHolder)holder;
    RetailerOfferPOJO current = data.get(position);
    //myHolder.lblID.setText(current.getsID());
    myHolder.lblOfferName.setText(current.getsOfferName());
    myHolder.lblDescription.setText(current.getsDescription());
    myHolder.lblPrice.setText(current.getsPrice());
}

@Override
public int getItemCount() {
    return data.size();
}

/**
 * Search Filter method for RecyclerView
 * @param searchModels
 */
public void setFilter(List<RetailerOfferPOJO> searchModels) {
    data = new ArrayList<>();
    data.addAll(searchModels);
    notifyDataSetChanged();
}

public static class MyHolder extends RecyclerView.ViewHolder  implements View.OnClickListener, View.OnLongClickListener{

    TextView lblID;
    TextView lblOfferName;
    TextView lblDescription;
    TextView lblPrice;

    // create constructor to get widget reference
    public MyHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        // lblID = (TextView) itemView.findViewById(R.id.lblID);
        lblOfferName = (TextView) itemView.findViewById(R.id.lblOfferName);
        lblDescription = (TextView) itemView.findViewById(R.id.lblDescription);
        lblPrice = (TextView) itemView.findViewById(R.id.lblPrice);

    }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    final MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            final List<RetailerOfferPOJO> filteredModelList = filter(mRetailerOffers, newText);
            if (!filteredModelList.isEmpty()) {
                mAdapter.setFilter(filteredModelList);
            }

            return true;
        }

    });




/**
 * Filter method for RecyclerView
 *
 * @param models
 * @param query -> data entered by the user as search parameter
 * @return
 */
private List<RetailerOfferPOJO> filter(List<RetailerOfferPOJO> models, String query) {

    //@param query -> the data entered by user is taken and converted to lowe case
    query = query.toLowerCase();

    final List<RetailerOfferPOJO> filteredModelList = new ArrayList<>();
    for (RetailerOfferPOJO model : models) {
        // the data that is populated in the RecyclerView is converted to lower case
        //full name and designation is attached to model class so that when the user searches
        //on either of them the recycler view displays data accordingly
        final String text = model.getsOfferName().toLowerCase();
        final String text1 = model.getsDescription().toLowerCase();
        if (text.contains(query)) {
            //check if the text in the recycler view contains the data entered by the user
            // and then update the list
            filteredModelList.add(model);
            mAdapter.notifyDataSetChanged();
        } else if (text1.contains(query)) {
            filteredModelList.add(model);
        }

    }
   // mAdapter.notifyDataSetChanged();
    return filteredModelList;
}
@覆盖
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单菜单菜单主菜单);
final MenuItem searchItem=menu.findItem(R.id.action\u search);
最终SearchView SearchView=(SearchView)MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
最终列表filteredModelList=过滤器(mRetailerOffers,newText);
如果(!filteredModelList.isEmpty()){
设置过滤器(filteredModelList);
}
返回true;
}
});
/**
*RecyclerView的过滤方法
*
*@param模型
*@param query->用户作为搜索参数输入的数据
*@返回
*/
私有列表筛选器(列表模型、字符串查询){
//@参数查询->获取用户输入的数据并转换为小写
query=query.toLowerCase();
final List filteredModelList=new ArrayList();
适用于(RetailerOfferPOJO型号:型号){
//在RecyclerView中填充的数据将转换为小写
//全名和名称附加到模型类,以便用户搜索时
//在它们中的任何一个上,回收器视图都会相应地显示数据
最终字符串text=model.getsOfferName().toLowerCase();
最后一个字符串text1=model.getsDescription().toLowerCase();
if(text.contains(查询)){
//检查“回收器”视图中的文本是否包含用户输入的数据
//然后更新列表
filteredModelList.add(model);
mAdapter.notifyDataSetChanged();
}else if(text1.contains(查询)){
filteredModelList.add(model);
}
}
//mAdapter.notifyDataSetChanged();
返回filteredModelList;
}

使用泛型适配器,为FilterGit调用
getFilter()
方法可能是因为,您的单击侦听器仍然使用旧列表,而不是新的“filteredModelList”感谢Harjot SIngh Oberai提供的提示。它现在正在运行。我犯的错误是在搜索筛选器中重新初始化了my model类,结果在旧列表中完成了recyclerview clicklistener事件。感谢您的回复,但我没有尝试您的方法。将为其提供一个tryuse通用适配器,调用
getFilter()
FilterGit的方法可能是因为,您的单击侦听器仍然使用旧列表,而不是新的“filteredModelList”感谢Harjot SIngh Oberai提供的提示。它现在正在运行。我犯的错误是在搜索筛选器中重新初始化了my model类,结果在旧列表中完成了recyclerview clicklistener事件。感谢您的回复,但我没有尝试您的方法。我将尝试一下