【问题标题】:Android. Search and filter in the RecyclerView安卓。在 RecyclerView 中搜索和过滤
【发布时间】:2017-01-24 18:34:36
【问题描述】:

使用“谷歌翻译”翻译!

简单介绍一下问题。我决定尝试使用 RecyclerView。搜索 listView 之类的现成解决方案,无需全部实现。于是我找到了一个解决方案,如果源代码底部有需要的话,但是有问题。 有一个列表,它显示标题,当您单击第二轮 Activiti 中已经有标题和完整描述的任何项目时。 意识到我喜欢: 在 MainActivity 我从数据库加载(使用 Sugar ORM)标题和 id

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);
}

然后将它们传送给适配器

mAdapter = new RecyclerAdapter(arrTitle,  arrId);

适配器 Recycler Adapter 我得到的值推导出到列表中,并且第二个通过 id Activity

        @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,从一开始。 来源搜索,如果您需要复制任何人,它工作正常,唯一的问题是通过单击列表项来传输数据。

activity_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"/>

MainActivity.java

 private SearchView searchView;

在创建时

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 ArrayList<String> mDataset;
private ArrayList<String> mCleanCopyDataset;

构造函数

public RecyclerAdapter(ArrayList<String> dataset) {
mDataset = dataset;
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();
}

完整代码 RecyclerAdapter.java

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();
}

}

【问题讨论】:

    标签: java android filter android-recyclerview


    【解决方案1】:

    您应该使用 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();
        }
    }
    

    然后在你的 onQueryTextChange 方法中,调用过滤器。

    @Override
    public boolean onQueryTextChange(String text) {
        mAdapter.getFilter().filter(text);
        return false;
    }
    

    【讨论】:

    • 我创建了一个具有这些方法的抽象适配器类。您将不得不直接管理您的数据列表。我将修改答案以适合您的数据集。
    猜你喜欢
    • 2017-11-11
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2018-08-23
    • 2017-04-06
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多