Java 安卓在RecyclerView中搜索和筛选
翻译使用“谷歌翻译” 简要介绍一下这个问题。我决定尝试使用RecyclerView。像SearchListView这样的现成解决方案,不需要全部实现。所以我找到了一个解决方案,如果在源代码的底部需要的话,但是有一个问题。 当你点击第二轮活动中已经有标题和完整描述的任何项目时,有一个列表,它显示标题。 意识到我喜欢: 在MainActivity中,我从数据库(使用Sugar ORM)加载头和idJava 安卓在RecyclerView中搜索和筛选,java,android,filter,android-recyclerview,Java,Android,Filter,Android Recyclerview,翻译使用“谷歌翻译” 简要介绍一下这个问题。我决定尝试使用RecyclerView。像SearchListView这样的现成解决方案,不需要全部实现。所以我找到了一个解决方案,如果在源代码的底部需要的话,但是有一个问题。 当你点击第二轮活动中已经有标题和完整描述的任何项目时,有一个列表,它显示标题。 意识到我喜欢: 在MainActivity中,我从数据库(使用Sugar ORM)加载头和id ArrayList<String> arrTitle = new ArrayList<
ArrayList<String> arrTitle = new ArrayList<>();
for(Contact contact:allContacts){
arrTitle.add(contact.title);
}
ArrayList<String> arrId = new ArrayList<>();
for(Contact contact:allContacts){
long i = contact.getId();
String str = Long.toString(i);
arrId.add(str);
}
adapter Recycler adapter I获取列表中的值推断标题,以及第二个pass id活动
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// Convert the id to the array
idTab = new String[mId.size()];
for (int i = 0; i != mId.size(); i++) {
idTab[i] = mId.get(i);
}
// Element position
final int idvadaptere = position;
// Display headers RecyclerView
holder.mTextView.setText(mDataset.get(position));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent ddddd = new Intent(context, LastActivity.class);
ddddd.putExtra("id", idTab[idvadaptere]);
context.startActivity(ddddd);
}
});
}
在第二个Activiti LastActivity中,我获得了id,并根据该id推断出文本字段中的值
// Get the Intent extract from it an object
// Extract from it an object
idString = intent.getStringExtra("id");
// Convert the id in number
idInt = Integer.parseInt(idString);
// Display the text fields
Contact title = Contact.findById(Contact.class, idInt);
String titleStr = title.title;
textView.setText(titleStr);
Contact prich = Contact.findById(Contact.class, idInt);
String prichStr = prich.prich;
textView2.setText(prichStr);
问题是,如果用于查找头,该列表的头位置将不是第五个,例如,第一个和id必须不同于第二个值aktiviti不公开第五个id,并且与第一个不同。
在源代码搜索中,如果您需要复制任何人,它可以正常工作,唯一的问题是通过单击列表项传输数据
活动\u main.xml
<android.support.v7.widget.SearchView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/search_view"
android:layout_gravity="right"
app:theme="@style/Theme.AppCompat.NoActionBar"
app:searchIcon="@drawable/ic_search_white_24dp"/>
立即创建
searchView = (SearchView) findViewById(R.id.search_view);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String text) {
return false;
}
@Override
public boolean onQueryTextChange(String text) {
mAdapter.filter(text);
return false;
}
});
RecyclerAdapter.java
private SearchView searchView;
private ArrayList<String> mDataset;
private ArrayList<String> mCleanCopyDataset;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private ArrayList<String> mDataset;
private ArrayList<String> mId;
private ArrayList<String> mCleanCopyDataset;
String[] idTab;
String[] titleTab;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View v) {
super(v);
mTextView = (TextView) v.findViewById(R.id.tv_recycler_item);
}
}
public RecyclerAdapter(ArrayList<String> dataset, String[] titleTab, ArrayList<String> id) {
mDataset = dataset;
titleTab = titleTab;
mId = id;
mCleanCopyDataset = mDataset;
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
idTab = new String[mId.size()];
for (int i = 0; i != mId.size(); i++) {
idTab[i] = mId.get(i);
}
holder.mTextView.setText(mDataset.get(position));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent ddddd = new Intent(context, LastActivity.class);
ddddd.putExtra("id", idTab[holder.getAdapterPosition()]);
context.startActivity(ddddd);
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
mDataset = new ArrayList<String>();
if (charText.length() == 0) {
mDataset.addAll(mCleanCopyDataset);
} else {
for (String item : mCleanCopyDataset) {
if (item.toLowerCase(Locale.getDefault()).contains(charText)) {
mDataset.add(item);
}
}
}
notifyDataSetChanged();
}
private ArrayList mDataset;
私有ArrayList mCleanCopyDataset;
建造师
public RecyclerAdapter(ArrayList<String> dataset) {
mDataset = dataset;
mCleanCopyDataset = mDataset;
}
公共回收适配器(ArrayList数据集){
mDataset=数据集;
mCleanCopyDataset=mDataset;
}
搜寻
// The filter () method we iterate through all the items on the list and if any item contains the search text, we add it to a new list mDataset:
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
mDataset = new ArrayList<String>();
if (charText.length() == 0) {
// mCleanCopyDataset we always contains the unaltered and the filter (full) copy of the list of data
mDataset.addAll(mCleanCopyDataset);
} else {
for (String item : mCleanCopyDataset) {
// we iterate through all the items on the list and if any item contains the search text, we add it to a new list mDataset
if (item.toLowerCase(Locale.getDefault()).contains(charText)) {
mDataset.add(item);
}
}
}
// method notifyDataSetChanged () allows you to update the list on the screen after filtration
notifyDataSetChanged();
}
//filter()方法迭代列表中的所有项目,如果任何项目包含搜索文本,则将其添加到新的列表mDataset:
公共空过滤器(字符串图表文本){
charText=charText.toLowerCase(Locale.getDefault());
mDataset=newarraylist();
如果(ChartText.length()==0){
//mCleanCopyDataset我们始终包含数据列表的未更改和筛选(完整)副本
mDataset.addAll(mcleancypydataset);
}否则{
用于(字符串项:mCleanCopyDataset){
//我们遍历列表中的所有项目,如果任何项目包含搜索文本,我们将其添加到新的列表mDataset中
if(item.toLowerCase(Locale.getDefault()).contains(charText)){
mDataset.add(项);
}
}
}
//方法notifyDataSetChanged()允许您在过滤后更新屏幕上的列表
notifyDataSetChanged();
}
完整代码
RecyclerAdapter.java
private SearchView searchView;
private ArrayList<String> mDataset;
private ArrayList<String> mCleanCopyDataset;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private ArrayList<String> mDataset;
private ArrayList<String> mId;
private ArrayList<String> mCleanCopyDataset;
String[] idTab;
String[] titleTab;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View v) {
super(v);
mTextView = (TextView) v.findViewById(R.id.tv_recycler_item);
}
}
public RecyclerAdapter(ArrayList<String> dataset, String[] titleTab, ArrayList<String> id) {
mDataset = dataset;
titleTab = titleTab;
mId = id;
mCleanCopyDataset = mDataset;
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_item, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
idTab = new String[mId.size()];
for (int i = 0; i != mId.size(); i++) {
idTab[i] = mId.get(i);
}
holder.mTextView.setText(mDataset.get(position));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent ddddd = new Intent(context, LastActivity.class);
ddddd.putExtra("id", idTab[holder.getAdapterPosition()]);
context.startActivity(ddddd);
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
mDataset = new ArrayList<String>();
if (charText.length() == 0) {
mDataset.addAll(mCleanCopyDataset);
} else {
for (String item : mCleanCopyDataset) {
if (item.toLowerCase(Locale.getDefault()).contains(charText)) {
mDataset.add(item);
}
}
}
notifyDataSetChanged();
}
公共类RecyclerAdapter扩展了RecyclerView.Adapter{
私有ArrayList数据集;
私人ArrayList mId;
私有ArrayList mCleanCopyDataset;
字符串[]idTab;
字符串[]titleTab;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图mTextView;
公共视图持有者(视图v){
超级(五);
mTextView=(TextView)v.findviewbyd(R.id.tv\u回收器\u项目);
}
}
公共回收器适配器(ArrayList数据集,字符串[]标题选项卡,ArrayList id){
mDataset=数据集;
titleTab=titleTab;
mId=id;
mCleanCopyDataset=mDataset;
}
@凌驾
public RecyclerAdapter.ViewHolder onCreateViewHolder(视图组父级、,
int视图类型){
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.recycler_项目,父项,假);
视窗支架vh=新视窗支架(v);
返回vh;
}
@凌驾
公共无效onBindViewHolder(最终ViewHolder,内部位置){
idTab=新字符串[mId.size()];
对于(int i=0;i!=mId.size();i++){
idTab[i]=mId.get(i);
}
holder.mTextView.setText(mDataset.get(position));
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Context=v.getContext();
Intent DDD=新的Intent(上下文,LastActivity.class);
putExtra(“id”,idTab[holder.getAdapterPosition());
背景。起始触觉(DDD);
}
});
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
公共空过滤器(字符串图表文本){
charText=charText.toLowerCase(Locale.getDefault());
mDataset=newarraylist();
如果(ChartText.length()==0){
mDataset.addAll(mcleancypydataset);
}否则{
用于(字符串项:mCleanCopyDataset){
if(item.toLowerCase(Locale.getDefault()).contains(charText)){
mDataset.add(项);
}
}
}
notifyDataSetChanged();
}
}
您应该使用Android的内置功能来过滤回收者视图 为此,请使您的RecyclerAdapter实现可过滤
public class MyAdapter extends RecyclerVew.Adapter implements Filterable {
private MyFilter filter;
public MyAdapter() {
// Do stuff
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new MyFilter(this, getElements());
}
return filter;
}
您会注意到在这个代码示例中,我有一个叫做MyFilter的东西。这是您将创建并提供自定义逻辑的内容
这里只是一个例子
private static class MyFilter extends Filter {
private final MyAdapter adapter;
private final List<String> originalList;
private final List<String> filteredList;
private MyFilter(MyAdapter adapter, List<String> originalList) {
super();
this.adapter = adapter;
this.originalList = new LinkedList<>(originalList);
this.filteredList = new ArrayList<>();
}
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
filteredList.clear();
final FilterResults results = new FilterResults();
if (charSequence.length() == 0) {
filteredList.addAll(originalList);
} else {
final String filterPattern = charSequence.toString().toLowerCase().trim();
for (String item : originalList) {
if (item.toLowerCase().contains(filterPattern) {
filteredList.add(item);
}
}
}
results.values = filteredList;
results.count = filteredList.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mDataset.clear();
mDataset.add(filterResults.values);
adapter.notifyDataSetChanged();
}
}
我创建了一个包含这些方法的抽象适配器类。您必须直接管理数据列表。我将修改答案以适合您的数据集。