在recyclerview中使用筛选方法自动搜索选项 [英] Autosearching option using filter method in recyclerview

查看:279
本文介绍了在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屋!

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