android - 在 Realm Recycler View Android 中搜索 View

标签 android search android-recyclerview realmsearchviewcontroller

<分区>

我在我的应用程序中实现了一个回收站 View 来显示公司中的人员列表。我将所有这些信息存储在 Realm DB 中。现在我想在窗口顶部实现搜索选项,以便用户可以按姓名搜索人。我尝试使用以下代码。但是这个功能不起作用。我无法在此窗口上进行任何搜索。这是我的 recyclerView searchView 代码。

我的 Activity 课

public class MyColleaguesPage extends AppCompatActivity implements MyColleaguesAdapter.ColleagueListListener{

private RecyclerView recyclerView;
private MyColleaguesAdapter adapter;
private Realm colleagueRealm;
private RealmResults<MyColleagueModel> colleagueResult;
private List<MyColleagueModel> filteredModelList;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mycolleagues_layout);

    }
    colleagueRealm = Realm.getDefaultInstance();
    recyclerView = (RecyclerView) findViewById(R.id.colleagues_recycler);

    if (!Prefs.with(this).getPreLoadColleague()) {
        setRealmData();
    }
    setUpRecycler();

    showAllPersons();

}

private void showAllPersons() {
    colleagueResult = colleagueRealm.where(MyColleagueModel.class).findAll();
    setAdapter(colleagueResult);
    adapter.notifyDataSetChanged();
}

private void setAdapter(RealmResults<MyColleagueModel> results) {

    adapter = new MyColleaguesAdapter(this, colleagueRealm.where(MyColleagueModel.class).findAllSortedAsync("id"),this);
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}
private void setUpRecycler() {
    // use this setting to improve performance if you know that changes
    // in content do not change the layout size of the RecyclerView
    recyclerView.setHasFixedSize(true);
    // use a linear layout manager since the cards are vertically scrollable
    final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(layoutManager);
}

private void setRealmData(){

    .......
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.recycler_menu, menu);

    final MenuItem item = menu.findItem(R.id.search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    search(searchView);
    return true;
}

private void search(SearchView searchView) {

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            filteredModelList = filter(colleagueResult, newText);

            if (filteredModelList.size() > 0) {
                return true;
            } else {
                Toast.makeText(MyColleaguesPage.this, "Not Found", Toast.LENGTH_SHORT).show();
                return false;
            }
        }
    });
}
private List<MyColleagueModel> filter(List<MyColleagueModel> models, String query) {
    query = query.toLowerCase();

    filteredModelList = new ArrayList<>();

    for (MyColleagueModel model : models) {
        final String text = model.getName().toLowerCase().toString();
        if (text.contains(query)) {
            filteredModelList.add(model);
        }
    }

    // arraylist in your adapter
    adapter = new MyColleaguesAdapter(this,colleagueRealm.where(MyColleagueModel.class).findAllSortedAsync("name"), getApplicationContext());
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

    return filteredModelList;
  }
}

我的适配器类

public class MyColleaguesAdapter extends RealmRecyclerViewAdapter<MyColleagueModel, MyColleaguesAdapter.ColleagueHolder>{

private List<MyColleagueModel> myColleagueModels;
private Context context;

public interface ColleagueListListener {

}

private final ColleagueListListener colleagueListListener;

public MyColleaguesAdapter(ColleagueListListener colleagueListListener, RealmResults<MyColleagueModel> realmResults, Context context ) {
    super(realmResults, true);
    this.context = context;
    this.colleagueListListener = colleagueListListener;
}

// create new views (invoked by the layout manager)
@Override
public ColleagueHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //inflate a new colleague view
    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 MyColleagueModel myColleague = getData().get(position);
    //final MyColleagueModel myColleague=realmResults.get(position);
    holder.colleagueName.setText(myColleague.getName());
    holder.companyName.setText(myColleague.getCompany());
    holder.jobTitle.setText(myColleague.getTitle());
    holder.cardView.setTag(position);
    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //editDataInterface.editData(view,position);
            int pos = (int)view.getTag();
            Intent i=new Intent(context,DetailMyColleague.class);
            i.putExtra("name",myColleague.getName());
            i.putExtra("title",myColleague.getTitle());
            i.putExtra("company",myColleague.getCompany());
            context.startActivity(i);
        }
    });

}

public class ColleagueHolder extends RecyclerView.ViewHolder{

   .......

      }
  }
 }

最佳答案

Your code looks good just one mistake though

You are filtering result and storing too like below

    filteredModelList = new ArrayList<>();

    for (MyColleagueModel model : models) {
        final String text = model.getName().toLowerCase().toString();
        if (text.contains(query)) {
            filteredModelList.add(model);
        }
    }

but passing data old data from realm to Adapter, not the Filtered data

// arraylist in your adapter
    adapter = new MyColleaguesAdapter(this,colleagueRealm.where(MyColleagueModel.class).findAllSortedAsync("name"), getApplicationContext());
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

try this might work

adapter = new MyColleaguesAdapter(this,
colleagueRealm.where(MyColleagueModel.class).contains("fieldToQueryBy", query, Case.INSENSITIVE).findAll(), getApplicationContext());
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

and one more thing you use ignoreCase instead of toLowercase for better matching

Hope it helped

关于android - 在 Realm Recycler View Android 中搜索 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45569513/

相关文章:

android - Firebase 数据库实例如何实时检索数据?

android - 滚动列表一次查看一项

MYSQL 日期范围 RFC 2822

algorithm - 表示数字段的数据结构

java - 当我滚动时,RecyclerView 设置了错误的项目高度

java - 我怎样才能阻止除我的 Android 应用程序之外的任何人与我的服务器通信

android - 在 android.widget.Scroller 中检测滚动结束

jquery - 如何解决实时搜索的 "lag"问题?

java - RecyclerView throw 和项目点击

android - 滚动到列表末尾