在recyclerview中使用筛选方法自动搜索选项 [英] Autosearching option using filter method in recyclerview
问题描述
在我的应用程序中,我使用cardview实现了一个recyclerview,以显示公司内部员工的列表。现在我想实现一个serch选项,用户可以通过这个选项来搜索员工的名字。我已经在网站上阅读过有关文件。我写了一个代码来实现一个serch选项。但不幸的是,我可以看到搜索选项,我可以写它,但它不能检测列表中的名称。我不知道我的代码里面有什么问题。这里是我的适配器类,其中我implment可Filterable mehtod
public class MyColleaguesAdapter extends RecyclerView.Adapter< MyColleaguesAdapter.ColleagueHolder>实现可过滤{
private static final String TAG =MyColleaguesAdapter;
protected List< MyColleageModel> colleagueObject;
protected List< MyColleageModel> filteredcolleague;
私有上下文上下文;
public MyColleaguesAdapter(List< MyColleageModel> colleagueObject,Context context){
this.colleagueObject = colleagueObject;
this.filteredcolleague = colleagueObject;
this.context = context;
$ b @Override
public ColleagueHolder onCreateViewHolder(ViewGroup parent,int viewType){
View view = LayoutInflater.from(parent.getContext())
。发音(R.layout.colleage_row_layout,parent,false);
返回新的同事管理者(查看);
$ b @Override
public void onBindViewHolder(ColleagueHolder holder,int position){
final MyColleageModel myColleague = colleagueObject.get(position);
holder.name.setText(myColleague.getName());
holder.company.setText(myColleague.getCompany());
holder.title.setText(myColleague.getTitle());
holder.cardView.setTag(position);
holder.cardView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
int pos =(int)view.getTag() ;
openDetailActivity(myColleague.getMobile(),myColleague.getMail(),myColleague.getName(),
myColleague.getCompany(),myColleague.getDepartment(),myColleague.getTitle());
}
});
@Override
public int getItemCount(){
return colleagueObject.size();
}
//打开活动
private void openDetailActivity(String ... details)
{
Intent i = new Intent(context,DetailMyColleague.class);
i.putExtra(mail,details [1]);
........
context.startActivity(i);
$ b @Override
public Filter getFilter(){
return new Filter(){
@SuppressWarnings(unchecked)
@Override
protected void publishResults(CharSequence constraint,FilterResults results){
filteredcolleague =(List< MyColleageModel>)results.values;
MyColleaguesAdapter.this.notifyDataSetChanged();
$ b @Override
Filter FilterResults performFiltering(CharSequence constraint){
List< MyColleageModel> filteredResults = null;
if(constraint.length()== 0){
filteredResults = colleagueObject;
} else {
filteredResults = getFilteredResults(constraint.toString()。toLowerCase());
}
FilterResults results = new FilterResults();
results.values = filteredResults;
返回结果;
}
};
}
protected List< MyColleageModel> getFilteredResults(String constraint){
List< MyColleageModel> results = new ArrayList<>(); (item):
(MyColleageModel item:colleagueObject){
if(item.getName()。toLowerCase()。contains(constraint)){
results.add(item);
Log.d(TAG,value is here+ item.getName());
}
}
返回结果;
public class ColleagueHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public CardView cardView;
公共TextView名称;
公共TextView公司;
公共TextView标题;
public ColleagueHolder(查看itemView){
super(itemView);
name =(TextView)itemView.findViewById(R.id.colleague_name);
company =(TextView)itemView.findViewById(R.id.company_name);
title =(TextView)itemView.findViewById(R.id.job_role);
cardView =(CardView)itemView.findViewById(R.id.cvSingleUser);
$ b $ p $这些是我的MainActivity
public class MyColleaguesPage extends AppCompatActivity implements SearchView.OnQueryTextListener {
private RecyclerView recyclerView;
私人CardView cardView;
私人MyColleaguesAdapter适配器;
私人列表< MyColleageModel> colleagueObject;
InputStream是;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.mycolleagues_layout);
$ b $ //显示并启用Home / Up按钮上的点击
if(getSupportActionBar()!= null){
getSupportActionBar()。setDisplayHomeAsUpEnabled(true);
getSupportActionBar()。setDisplayShowHomeEnabled(true);
}
cardView =(CardView)findViewById(R.id.cvSingleUser);
recyclerView =(RecyclerView)findViewById(R.id.colleagues_recycler);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MyColleaguesPage.this);
recyclerView.setLayoutManager(layoutManager);
new JSONTask()。execute();
$ b @Override
public boolean onQueryTextSubmit(String query){
return false;
}
@Override
public boolean onQueryTextChange(String newText){
List< MyColleageModel> filteredModelList = filter(colleagueObject,newText);
if(filteredModelList.size()> 0){
//myPhotosAdapter.setFilter(filteredModelList);
返回true;
} else {
Toast.makeText(MyColleaguesPage.this,Not Found,Toast.LENGTH_SHORT).show();
返回false;
$ b public class JSONTask extends AsyncTask< String,String,List< MyColleageModel>> {
@Override
保护无效onPreExecute(){
super.onPreExecute();
}
@Override
protected List< MyColleageModel> doInBackground(String ... params){
colleagueObject = new ArrayList< MyColleageModel>();
try {
// withou Gson
JSONObject obj = new JSONObject(loadJSONFromAsset());
JSONArray m_jArry = obj.getJSONArray(contacts);
MyColleageModel my_clg;
for(int i = 0; i< m_jArry.length(); i ++){
JSONObject jo_inside = m_jArry.getJSONObject(i);
字符串val1 = jo_inside.getString(mobile);
字符串val2 = jo_inside.getString(mail);
字符串val3 = jo_inside.getString(name);
字符串val4 = jo_inside.optString(company);
字符串val5 = jo_inside.optString(department);
字符串val6 = jo_inside.optString(title);
my_clg = new MyColleageModel(val1,val2,val3,val4,val5,val6);
colleagueObject.add(my_clg);
$ b $ catch(JSONException e){
e.printStackTrace();
}
返回null;
$ b @Override
protected void onPostExecute(final List< MyColleageModel> result){
super.onPostExecute(result);
adapter = new MyColleaguesAdapter(colleagueObject,getApplicationContext());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
$ b private String loadJSONFromAsset(){
....
}
@覆盖
public boolean onCreateOptionsMenu(Menu menu){
$ b $ getMenuInflater()。inflate(R.menu.recyclerviewmenu,menu);
final MenuItem search = menu.findItem(R.id.search);
最终SearchView searchView =(SearchView)MenuItemCompat.getActionView(search);
searchView.setOnQueryTextListener(this);
返回true;
}
私人列表< MyColleageModel> filter(List< MyColleageModel> models,String query){
query = query.toLowerCase();
最终列表< MyColleageModel> filteredModelList = new ArrayList<>(); (MyColleageModel model:models)
{
final String text = model.getName()。toLowerCase()。toString();
if(text.contains(query)){
filteredModelList.add(model);
$ b在你的适配器中的arraylist
adapter = new MyColleaguesAdapter(colleagueObject,getApplicationContext());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
return filteredModelList;
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if(id == android.R.id.home){
finish();
}
return super.onOptionsItemSelected(item);
code
$ b $ p
$ b 这是我的recyclerviewmenu.xml
< menu xmlns:android =http://schemas.android.com/apk / res / android
xmlns:app =http://schemas.android.com/apk/res-auto
xmlns:tools =http://schemas.android.com/tools tools:context =myColleagues.MyColleaguesPage>
android:id =@ + id / search
android:icon =@ drawable / ic_search
android:title =Search
app:showAsAction =ifRoom | collapseActionView
app:actionViewClass =android.support.v7.widget.SearchView/>
< / menu>
我没有在代码中看到错误。 =h2_lin>解决方案
遵循这个stpes
第1步实现 SearchView。 OnQueryTextListener
inactivity
第2步 onCreateOptionsMenu
写入下面的代码
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater()。inflate R.menu.menu_album_search,menu);
final MenuItem item = menu.findItem(R.id.menu_search_album);
final SearchView searchView =(SearchView)MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
返回true;
}
第3步写在 onQueryTextChange()
方法
@Override
public boolean onQueryTextChange(String newText) {
列表< MyColleageModel> filteredModelList = filter(data_fieldses,newText);
if(filteredModelList.size()> 0){
//myPhotosAdapter.setFilter(filteredModelList);
返回true;
} else {
Toast.makeText(MyPhotosActivity.this,Not Found,Toast.LENGTH_SHORT).show();
返回false;
$ b 第4步 strong>
私人列表< MyColleageModel> filter(List< MyColleageModel> models,String query){
query = query.toLowerCase();
最终列表< MyColleageModel> filteredModelList = new ArrayList<>(); (MyColleageModel model:models)
(
final String text = model.getImagename()。toLowerCase()。toString();
if(text.contains(query)){
filteredModelList.add(model);
//你的适配器中的数组列表
myPhotosAdapter = new MyPhotosAdapter(MyPhotosActivity.this,(ArrayList< MyColleageModel>)filteredModelList);
recyclerViewMyPhotos.setLayoutManager(新的GridLayoutManager(MyPhotosActivity.this,2));
recyclerViewMyPhotos.setAdapter(myPhotosAdapter);
myPhotosAdapter.notifyDataSetChanged();
返回filteredModelList;
$ / code>
在任何查询的情况下询问我
In my app I have implemented a recyclerview with cardview to show the list of the employee inside a company. Now I want to implement a serch option by which user can search with the name of the employee. I have read related document in website about it. I wrote a code to implement a serch option. But unfortunately I can see the search option and I can write it but it cannot detect the name from the list. I do not know what is the problem inside my code. Here is my adapter class where I implment Filterable mehtod
public class MyColleaguesAdapter extends RecyclerView.Adapter<MyColleaguesAdapter.ColleagueHolder> implements Filterable {
private static final String TAG = "MyColleaguesAdapter";
protected List<MyColleageModel> colleagueObject;
protected List<MyColleageModel> filteredcolleague;
private Context context;
public MyColleaguesAdapter(List<MyColleageModel> colleagueObject, Context context) {
this.colleagueObject = colleagueObject;
this.filteredcolleague=colleagueObject;
this.context = context;
}
@Override
public ColleagueHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext())
.inflate(R.layout.colleage_row_layout,parent,false);
return new ColleagueHolder(view);
}
@Override
public void onBindViewHolder(ColleagueHolder holder, int position) {
final MyColleageModel myColleague=colleagueObject.get(position);
holder.name.setText(myColleague.getName());
holder.company.setText(myColleague.getCompany());
holder.title.setText(myColleague.getTitle());
holder.cardView.setTag(position);
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = (int)view.getTag();
openDetailActivity(myColleague.getMobile(),myColleague.getMail(), myColleague.getName(),
myColleague.getCompany(), myColleague.getDepartment(), myColleague.getTitle());
}
});
}
@Override
public int getItemCount() {
return colleagueObject.size();
}
//open activity
private void openDetailActivity(String...details)
{
Intent i=new Intent(context,DetailMyColleague.class);
i.putExtra("mail",details[1]);
........
context.startActivity(i);
}
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredcolleague = (List<MyColleageModel>) results.values;
MyColleaguesAdapter.this.notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<MyColleageModel> filteredResults = null;
if (constraint.length() == 0) {
filteredResults = colleagueObject;
} else {
filteredResults = getFilteredResults(constraint.toString().toLowerCase());
}
FilterResults results = new FilterResults();
results.values = filteredResults;
return results;
}
};
}
protected List<MyColleageModel> getFilteredResults(String constraint) {
List<MyColleageModel> results = new ArrayList<>();
for (MyColleageModel item : colleagueObject) {
if (item.getName().toLowerCase().contains(constraint)) {
results.add(item);
Log.d( TAG,"value is here "+item.getName());
}
}
return results;
}
public class ColleagueHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public CardView cardView;
public TextView name;
public TextView company;
public TextView title;
public ColleagueHolder(View itemView) {
super(itemView);
name=(TextView) itemView.findViewById(R.id.colleague_name);
company=(TextView)itemView.findViewById(R.id.company_name);
title=(TextView) itemView.findViewById(R.id.job_role);
cardView=(CardView)itemView.findViewById(R.id.cvSingleUser);
}
}
Here is my MainActivity
public class MyColleaguesPage extends AppCompatActivity implements SearchView.OnQueryTextListener{
private RecyclerView recyclerView;
private CardView cardView;
private MyColleaguesAdapter adapter;
private List<MyColleageModel> colleagueObject;
InputStream is;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mycolleagues_layout);
// Showing and Enabling clicks on the Home/Up button
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
cardView=(CardView)findViewById(R.id.cvSingleUser);
recyclerView = (RecyclerView) findViewById(R.id.colleagues_recycler);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MyColleaguesPage.this);
recyclerView.setLayoutManager(layoutManager);
new JSONTask().execute();
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
List<MyColleageModel> filteredModelList = filter(colleagueObject, newText);
if (filteredModelList.size() > 0) {
//myPhotosAdapter.setFilter(filteredModelList);
return true;
} else {
Toast.makeText(MyColleaguesPage.this, "Not Found", Toast.LENGTH_SHORT).show();
return false;
}
}
public class JSONTask extends AsyncTask<String, String, List<MyColleageModel>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected List<MyColleageModel> doInBackground(String... params) {
colleagueObject = new ArrayList<MyColleageModel>();
try {
//withou Gson
JSONObject obj = new JSONObject(loadJSONFromAsset());
JSONArray m_jArry = obj.getJSONArray("contacts");
MyColleageModel my_clg;
for (int i = 0; i < m_jArry.length(); i++) {
JSONObject jo_inside = m_jArry.getJSONObject(i);
String val1 = jo_inside.getString("mobile");
String val2 = jo_inside.getString("mail");
String val3 = jo_inside.getString("name");
String val4 = jo_inside.optString("company");
String val5 = jo_inside.optString("department");
String val6 = jo_inside.optString("title");
my_clg = new MyColleageModel(val1, val2, val3, val4, val5, val6);
colleagueObject.add(my_clg);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(final List<MyColleageModel> result) {
super.onPostExecute(result);
adapter = new MyColleaguesAdapter(colleagueObject, getApplicationContext());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
private String loadJSONFromAsset() {
....
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.recyclerviewmenu, menu);
final MenuItem search = menu.findItem(R.id.search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
searchView.setOnQueryTextListener(this);
return true;
}
private List<MyColleageModel> filter(List<MyColleageModel> models, String query) {
query = query.toLowerCase();
final List<MyColleageModel> filteredModelList = new ArrayList<>();
for (MyColleageModel model : models) {
final String text = model.getName().toLowerCase().toString();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
// arraylist in your adapter
adapter = new MyColleaguesAdapter(colleagueObject, getApplicationContext());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
return filteredModelList;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
}
And this is my recyclerviewmenu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context="myColleagues.MyColleaguesPage">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
I am not getting the error inside my code.
解决方案 follow this stpes
step 1 implements SearchView.OnQueryTextListener
in youractivity
step 2 in onCreateOptionsMenu
write below code
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_album_search, menu);
final MenuItem item = menu.findItem(R.id.menu_search_album);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
return true;
}
step 3 write this in onQueryTextChange()
method
@Override
public boolean onQueryTextChange(String newText) {
List<MyColleageModel> filteredModelList = filter(data_fieldses, newText);
if (filteredModelList.size() > 0) {
//myPhotosAdapter.setFilter(filteredModelList);
return true;
} else {
Toast.makeText(MyPhotosActivity.this, "Not Found", Toast.LENGTH_SHORT).show();
return false;
}
}
step 4
private List<MyColleageModel> filter(List<MyColleageModel> models, String query) {
query = query.toLowerCase();
final List<MyColleageModel> filteredModelList = new ArrayList<>();
for (MyColleageModel model : models) {
final String text = model.getImagename().toLowerCase().toString();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
// arraylist in your adapter
myPhotosAdapter = new MyPhotosAdapter( MyPhotosActivity.this, (ArrayList<MyColleageModel>) filteredModelList);
recyclerViewMyPhotos.setLayoutManager(new GridLayoutManager(MyPhotosActivity.this, 2));
recyclerViewMyPhotos.setAdapter(myPhotosAdapter);
myPhotosAdapter.notifyDataSetChanged();
return filteredModelList;
}
ask me in case of any query
这篇关于在recyclerview中使用筛选方法自动搜索选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!