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事件。感谢您的回复,但我没有尝试您的方法。我将尝试一下