- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从支持库中实现 SearchView
。我希望用户使用 SearchView
来过滤 List
中的电影 RecyclerView
。
到目前为止,我已经学习了一些教程,并将 SearchView
添加到 ActionBar
,但我不确定从哪里开始。我看过一些例子,但当你开始打字时,它们都没有显示结果。
这是我的 MainActivity
:
public class MainActivity extends ActionBarActivity {
RecyclerView mRecyclerView;
RecyclerView.LayoutManager mLayoutManager;
RecyclerView.Adapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new CardAdapter() {
@Override
public Filter getFilter() {
return null;
}
};
mRecyclerView.setAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Adapter
:
public abstract class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> implements Filterable {
List<Movie> mItems;
public CardAdapter() {
super();
mItems = new ArrayList<Movie>();
Movie movie = new Movie();
movie.setName("Spiderman");
movie.setRating("92");
mItems.add(movie);
movie = new Movie();
movie.setName("Doom 3");
movie.setRating("91");
mItems.add(movie);
movie = new Movie();
movie.setName("Transformers");
movie.setRating("88");
mItems.add(movie);
movie = new Movie();
movie.setName("Transformers 2");
movie.setRating("87");
mItems.add(movie);
movie = new Movie();
movie.setName("Transformers 3");
movie.setRating("86");
mItems.add(movie);
movie = new Movie();
movie.setName("Noah");
movie.setRating("86");
mItems.add(movie);
movie = new Movie();
movie.setName("Ironman");
movie.setRating("86");
mItems.add(movie);
movie = new Movie();
movie.setName("Ironman 2");
movie.setRating("86");
mItems.add(movie);
movie = new Movie();
movie.setName("Ironman 3");
movie.setRating("86");
mItems.add(movie);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_view_card_item, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Movie movie = mItems.get(i);
viewHolder.tvMovie.setText(movie.getName());
viewHolder.tvMovieRating.setText(movie.getRating());
}
@Override
public int getItemCount() {
return mItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView tvMovie;
public TextView tvMovieRating;
public ViewHolder(View itemView) {
super(itemView);
tvMovie = (TextView)itemView.findViewById(R.id.movieName);
tvMovieRating = (TextView)itemView.findViewById(R.id.movieRating);
}
}
}
最佳答案
介绍
由于从您的问题中并不清楚您到底遇到了什么问题,因此我编写了有关如何实现此功能的快速演练;如果您仍有问题,请随时提出。
我在这个 GitHub Repository 中有我在这里谈论的一切的工作示例。
在任何情况下,结果都应该是这样的:
如果您首先想使用演示应用程序,您可以从 Play 商店安装它:
无论如何,让我们开始吧。
设置 SearchView
在文件夹 res/menu
中创建一个名为 main_menu.xml
的新文件。在其中添加一个项目并将 actionViewClass
设置为 android.support.v7.widget.SearchView
。由于您使用的是支持库,因此您必须使用支持库的命名空间来设置 actionViewClass
属性。您的 xml 文件应如下所示:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_search"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
</menu>
在您的
Fragment
或
Activity
你有夸大像往常这个菜单XML,那么你可以看看其中包含
MenuItem
的
SearchView
贯彻
OnQueryTextListener
我们将使用监听更改进入
SearchView
全文:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(this);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
// Here is where we are going to implement the filter logic
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
现在
SearchView
可以使用了。一旦我们完成了
onQueryTextChange()
的实现,我们稍后将在
Adapter
中实现过滤器逻辑。
Adapter
首先,这是我将用于此示例的模型类:
public class ExampleModel {
private final long mId;
private final String mText;
public ExampleModel(long id, String text) {
mId = id;
mText = text;
}
public long getId() {
return mId;
}
public String getText() {
return mText;
}
}
这只是您的基本模型,它将在
RecyclerView
中显示文本。这是我将用于显示文本的布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="model"
type="com.github.wrdlbrnft.searchablerecyclerviewdemo.ui.models.ExampleModel"/>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="@{model.text}"/>
</FrameLayout>
</layout>
如您所见,我使用数据绑定(bind)。如果您以前从未使用过数据绑定(bind),请不要气馁!它非常简单和强大,但是我无法解释它在这个答案的范围内是如何工作的。
ViewHolder
类的
ExampleModel
:
public class ExampleViewHolder extends RecyclerView.ViewHolder {
private final ItemExampleBinding mBinding;
public ExampleViewHolder(ItemExampleBinding binding) {
super(binding.getRoot());
mBinding = binding;
}
public void bind(ExampleModel item) {
mBinding.setModel(item);
}
}
再次没什么特别的。它只是使用数据绑定(bind)将模型类绑定(bind)到这个布局,正如我们在上面的布局 xml 中定义的那样。
Adapter
的基本实现,而是专注于与此答案相关的部分。
SortedList
类。
SortedList
是一个非常棒的工具,它是
RecyclerView
库的一部分。它负责通知
Adapter
有关数据集更改的信息,这是一种非常有效的方式。它唯一需要您做的就是指定元素的顺序。您需要通过实现
compare()
方法来做到这一点,该方法比较
SortedList
中的两个元素,就像
Comparator
一样。但是不是对
List
进行排序,而是用于对
RecyclerView
中的项目进行排序!
SortedList
通过您必须实现的
Adapter
类与
Callback
交互:
private final SortedList.Callback<ExampleModel> mCallback = new SortedList.Callback<ExampleModel>() {
@Override
public void onInserted(int position, int count) {
mAdapter.notifyItemRangeInserted(position, count);
}
@Override
public void onRemoved(int position, int count) {
mAdapter.notifyItemRangeRemoved(position, count);
}
@Override
public void onMoved(int fromPosition, int toPosition) {
mAdapter.notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onChanged(int position, int count) {
mAdapter.notifyItemRangeChanged(position, count);
}
@Override
public int compare(ExampleModel a, ExampleModel b) {
return mComparator.compare(a, b);
}
@Override
public boolean areContentsTheSame(ExampleModel oldItem, ExampleModel newItem) {
return oldItem.equals(newItem);
}
@Override
public boolean areItemsTheSame(ExampleModel item1, ExampleModel item2) {
return item1.getId() == item2.getId();
}
}
在回调顶部的方法中,如
onMoved
、
onInserted
等,您必须调用
Adapter
的等效通知方法。底部的三个方法
compare
、
areContentsTheSame
和
areItemsTheSame
您必须根据要显示的对象类型以及这些对象出现在屏幕上的顺序来实现。
@Override
public int compare(ExampleModel a, ExampleModel b) {
return mComparator.compare(a, b);
}
这就是我之前讲的
compare()
方法。在这个例子中,我只是将调用传递给比较两个模型的
Comparator
。如果您希望项目按字母顺序出现在屏幕上。这个比较器可能如下所示:
private static final Comparator<ExampleModel> ALPHABETICAL_COMPARATOR = new Comparator<ExampleModel>() {
@Override
public int compare(ExampleModel a, ExampleModel b) {
return a.getText().compareTo(b.getText());
}
};
现在让我们看看下一个方法:
@Override
public boolean areContentsTheSame(ExampleModel oldItem, ExampleModel newItem) {
return oldItem.equals(newItem);
}
此方法的目的是确定模型的内容是否已更改。
SortedList
使用它来确定是否需要调用更改事件 - 换句话说,
RecyclerView
是否应该对旧版本和新版本进行淡入淡出。如果您的模型类具有正确的
equals()
和
hashCode()
实现,您通常可以像上面那样实现它。如果我们将
equals()
和
hashCode()
实现添加到
ExampleModel
类,它应该看起来像这样:
public class ExampleModel implements SortedListAdapter.ViewModel {
private final long mId;
private final String mText;
public ExampleModel(long id, String text) {
mId = id;
mText = text;
}
public long getId() {
return mId;
}
public String getText() {
return mText;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ExampleModel model = (ExampleModel) o;
if (mId != model.mId) return false;
return mText != null ? mText.equals(model.mText) : model.mText == null;
}
@Override
public int hashCode() {
int result = (int) (mId ^ (mId >>> 32));
result = 31 * result + (mText != null ? mText.hashCode() : 0);
return result;
}
}
快速旁注:大多数 IDE(如 Android Studio、IntelliJ 和 Eclipse)都具有为您生成
equals()
和
hashCode()
实现的功能,只需按一下按钮!所以你不必自己实现它们。在互联网上查看它在您的 IDE 中的工作方式!
@Override
public boolean areItemsTheSame(ExampleModel item1, ExampleModel item2) {
return item1.getId() == item2.getId();
}
SortedList
使用这种方法来检查两个项目是否指向同一事物。简单来说(不解释
SortedList
的工作原理)这用于确定对象是否已包含在
List
中,以及是否需要播放添加、移动或更改动画。如果你的模型有一个 id,你通常会在这个方法中只比较 id。如果他们不需要,您需要找出其他方法来检查这一点,但最终实现这取决于您的特定应用程序。通常,给所有模型一个 id 是最简单的选择 - 例如,如果您从数据库中查询数据,它可能是主键字段。
SortedList.Callback
后,我们可以创建
SortedList
的实例:
final SortedList<ExampleModel> list = new SortedList<>(ExampleModel.class, mCallback);
作为
SortedList
构造函数中的第一个参数,您需要传递模型的类。另一个参数就是我们上面定义的
SortedList.Callback
。
Adapter
实现
SortedList
,它应该看起来像这样:
public class ExampleAdapter extends RecyclerView.Adapter<ExampleViewHolder> {
private final SortedList<ExampleModel> mSortedList = new SortedList<>(ExampleModel.class, new SortedList.Callback<ExampleModel>() {
@Override
public int compare(ExampleModel a, ExampleModel b) {
return mComparator.compare(a, b);
}
@Override
public void onInserted(int position, int count) {
notifyItemRangeInserted(position, count);
}
@Override
public void onRemoved(int position, int count) {
notifyItemRangeRemoved(position, count);
}
@Override
public void onMoved(int fromPosition, int toPosition) {
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onChanged(int position, int count) {
notifyItemRangeChanged(position, count);
}
@Override
public boolean areContentsTheSame(ExampleModel oldItem, ExampleModel newItem) {
return oldItem.equals(newItem);
}
@Override
public boolean areItemsTheSame(ExampleModel item1, ExampleModel item2) {
return item1.getId() == item2.getId();
}
});
private final LayoutInflater mInflater;
private final Comparator<ExampleModel> mComparator;
public ExampleAdapter(Context context, Comparator<ExampleModel> comparator) {
mInflater = LayoutInflater.from(context);
mComparator = comparator;
}
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final ItemExampleBinding binding = ItemExampleBinding.inflate(inflater, parent, false);
return new ExampleViewHolder(binding);
}
@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
final ExampleModel model = mSortedList.get(position);
holder.bind(model);
}
@Override
public int getItemCount() {
return mSortedList.size();
}
}
用于对项目进行排序的
Comparator
是通过构造函数传入的,因此即使项目应该以不同的顺序显示,我们也可以使用相同的
Adapter
。
Adapter
添加或删除项目的方法。为此,我们可以向
Adapter
添加方法,这允许我们向
SortedList
添加和删除项目:
public void add(ExampleModel model) {
mSortedList.add(model);
}
public void remove(ExampleModel model) {
mSortedList.remove(model);
}
public void add(List<ExampleModel> models) {
mSortedList.addAll(models);
}
public void remove(List<ExampleModel> models) {
mSortedList.beginBatchedUpdates();
for (ExampleModel model : models) {
mSortedList.remove(model);
}
mSortedList.endBatchedUpdates();
}
我们不需要在这里调用任何通知方法,因为
SortedList
已经通过
SortedList.Callback
做到了这一点!除此之外,这些方法的实现非常简单,只有一个异常(exception):remove 方法删除了
List
模型。由于
SortedList
只有一个 remove 方法可以删除单个对象,因此我们需要遍历列表并一个一个删除模型。在开始时调用
beginBatchedUpdates()
将我们将要对
SortedList
进行的所有更改批量化并提高性能。当我们调用
endBatchedUpdates()
时,会立即通知
RecyclerView
所有更改。
SortedList
并且它已经在
SortedList
中,它将不会再次添加。取而代之的是
SortedList
使用
areContentsTheSame()
方法来确定对象是否已更改 - 如果它在
RecyclerView
中有项目将被更新。
RecyclerView
中的所有项目。删除不在
List
中的所有内容,并添加
SortedList
中缺少的所有项目:
public void replaceAll(List<ExampleModel> models) {
mSortedList.beginBatchedUpdates();
for (int i = mSortedList.size() - 1; i >= 0; i--) {
final ExampleModel model = mSortedList.get(i);
if (!models.contains(model)) {
mSortedList.remove(model);
}
}
mSortedList.addAll(models);
mSortedList.endBatchedUpdates();
}
此方法再次将所有更新一起批处理以提高性能。第一个循环是相反的,因为在开始时删除一个项目会弄乱它之后出现的所有项目的索引,这在某些情况下会导致数据不一致等问题。之后,我们只需使用
List
将
SortedList
添加到
addAll()
以添加所有尚未在
SortedList
中的项目,并且 - 就像上面描述的 -15 中的所有项目一样,更新 123.13.
SortedList
就完成了。整个事情应该是这样的:
public class ExampleAdapter extends RecyclerView.Adapter<ExampleViewHolder> {
private final SortedList<ExampleModel> mSortedList = new SortedList<>(ExampleModel.class, new SortedList.Callback<ExampleModel>() {
@Override
public int compare(ExampleModel a, ExampleModel b) {
return mComparator.compare(a, b);
}
@Override
public void onInserted(int position, int count) {
notifyItemRangeInserted(position, count);
}
@Override
public void onRemoved(int position, int count) {
notifyItemRangeRemoved(position, count);
}
@Override
public void onMoved(int fromPosition, int toPosition) {
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onChanged(int position, int count) {
notifyItemRangeChanged(position, count);
}
@Override
public boolean areContentsTheSame(ExampleModel oldItem, ExampleModel newItem) {
return oldItem.equals(newItem);
}
@Override
public boolean areItemsTheSame(ExampleModel item1, ExampleModel item2) {
return item1 == item2;
}
});
private final Comparator<ExampleModel> mComparator;
private final LayoutInflater mInflater;
public ExampleAdapter(Context context, Comparator<ExampleModel> comparator) {
mInflater = LayoutInflater.from(context);
mComparator = comparator;
}
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final ItemExampleBinding binding = ItemExampleBinding.inflate(mInflater, parent, false);
return new ExampleViewHolder(binding);
}
@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
final ExampleModel model = mSortedList.get(position);
holder.bind(model);
}
public void add(ExampleModel model) {
mSortedList.add(model);
}
public void remove(ExampleModel model) {
mSortedList.remove(model);
}
public void add(List<ExampleModel> models) {
mSortedList.addAll(models);
}
public void remove(List<ExampleModel> models) {
mSortedList.beginBatchedUpdates();
for (ExampleModel model : models) {
mSortedList.remove(model);
}
mSortedList.endBatchedUpdates();
}
public void replaceAll(List<ExampleModel> models) {
mSortedList.beginBatchedUpdates();
for (int i = mSortedList.size() - 1; i >= 0; i--) {
final ExampleModel model = mSortedList.get(i);
if (!models.contains(model)) {
mSortedList.remove(model);
}
}
mSortedList.addAll(models);
mSortedList.endBatchedUpdates();
}
@Override
public int getItemCount() {
return mSortedList.size();
}
}
现在唯一缺少的是实现过滤!
Adapter
。在这个例子中,我从电影数组中创建了一个
List
的
List
实例:
private static final String[] MOVIES = new String[]{
...
};
private static final Comparator<ExampleModel> ALPHABETICAL_COMPARATOR = new Comparator<ExampleModel>() {
@Override
public int compare(ExampleModel a, ExampleModel b) {
return a.getText().compareTo(b.getText());
}
};
private ExampleAdapter mAdapter;
private List<ExampleModel> mModels;
private RecyclerView mRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mAdapter = new ExampleAdapter(this, ALPHABETICAL_COMPARATOR);
mBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
mBinding.recyclerView.setAdapter(mAdapter);
mModels = new ArrayList<>();
for (String movie : MOVIES) {
mModels.add(new ExampleModel(movie));
}
mAdapter.add(mModels);
}
这里没什么特别的,我们只是实例化
ExampleModel
并将其设置为
Adapter
。之后,我们从
RecyclerView
数组中的电影名称创建了一个
List
模型。然后我们将所有模型添加到
MOVIES
。
SortedList
并开始实现过滤器逻辑:
@Override
public boolean onQueryTextChange(String query) {
final List<ExampleModel> filteredModelList = filter(mModels, query);
mAdapter.replaceAll(filteredModelList);
mBinding.recyclerView.scrollToPosition(0);
return true;
}
这再次非常简单。我们调用方法
onQueryTextChange()
并传入
filter()
的
List
以及查询字符串。然后我们在
ExampleModel
上调用
replaceAll()
并传入由
Adapter
返回的过滤后的
List
。我们还必须在
filter()
上调用
scrollToPosition(0)
以确保用户在搜索某些内容时始终可以看到所有项目。否则
RecyclerView
可能会在过滤时停留在向下滚动的位置并随后隐藏一些项目。滚动到顶部可确保在搜索时获得更好的用户体验。
RecyclerView
本身:
private static List<ExampleModel> filter(List<ExampleModel> models, String query) {
final String lowerCaseQuery = query.toLowerCase();
final List<ExampleModel> filteredModelList = new ArrayList<>();
for (ExampleModel model : models) {
final String text = model.getText().toLowerCase();
if (text.contains(lowerCaseQuery)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
我们在这里做的第一件事是在查询字符串上调用
filter()
。我们不希望我们的搜索函数区分大小写,通过对所有比较的字符串调用
toLowerCase()
,我们可以确保无论大小写都返回相同的结果。然后它只是遍历我们传递给它的
toLowerCase()
中的所有模型,并检查查询字符串是否包含在模型的文本中。如果是,则将模型添加到过滤后的
List
中。
List
的
Adapter
实现更简单。
SortedList
已经负责处理
Adapter
以及将模型绑定(bind)到
SortedList
实例的类,并提供了一种基于 0x2518124313431 实现
ViewHolder
的便捷方法为此,我们必须做两件事:
Adapter
接口(interface),所有模型类都必须实现 SortedList
子类,它定义了一个 ViewModel
方法,ViewHolder
可以用来自动绑定(bind)模型。 bind()
实现来只关注应该在
Adapter
中显示的内容。使用这个基类,我们不必担心
RecyclerView
及其
ViewHolder
的复杂细节。
Adapter
- 在这个
GitHub Gist 。
SortedList
的库!如果您想使用它,那么您需要做的就是将此依赖项添加到您的应用程序的 build.gradle 文件中:
compile 'com.github.wrdlbrnft:sorted-list-adapter:0.2.0.1'
您可以在
on the library homepage 中找到有关此库的更多信息。
SortedListAdapter
,我们必须进行两项更改:
SortedListAdapter
使其扩展 SortedListAdapter
。类型参数应该是应该绑定(bind)到这个 ViewHolder
的模型 - 在这种情况下 SortedListAdapter.ViewHolder
。您必须将数据绑定(bind)到 ViewHolder
而不是 ExampleModel
中的模型。 public class ExampleViewHolder extends SortedListAdapter.ViewHolder<ExampleModel> {
private final ItemExampleBinding mBinding;
public ExampleViewHolder(ItemExampleBinding binding) {
super(binding.getRoot());
mBinding = binding;
}
@Override
protected void performBind(ExampleModel item) {
mBinding.setModel(item);
}
}
performBind()
接口(interface): public class ExampleModel implements SortedListAdapter.ViewModel {
...
}
bind()
以扩展
ViewModel
并删除我们不再需要的所有内容。 type 参数应该是您正在使用的模型类型 - 在本例中为
ExampleAdapter
。但是,如果您使用不同类型的模型,则将类型参数设置为
SortedListAdapter
。
public class ExampleAdapter extends SortedListAdapter<ExampleModel> {
public ExampleAdapter(Context context, Comparator<ExampleModel> comparator) {
super(context, ExampleModel.class, comparator);
}
@Override
protected ViewHolder<? extends ExampleModel> onCreateViewHolder(LayoutInflater inflater, ViewGroup parent, int viewType) {
final ItemExampleBinding binding = ItemExampleBinding.inflate(inflater, parent, false);
return new ExampleViewHolder(binding);
}
@Override
protected boolean areItemsTheSame(ExampleModel item1, ExampleModel item2) {
return item1.getId() == item2.getId();
}
@Override
protected boolean areItemContentsTheSame(ExampleModel oldItem, ExampleModel newItem) {
return oldItem.equals(newItem);
}
}
之后我们就完成了!然而,最后一件事要提到:
ExampleModel
没有相同的
ViewModel
、
SortedListAdapter
或 0x2518122313431141 方法我们原来的 0x23413 有 0x23413它使用一个单独的
add()
对象来修改列表中可以通过
remove()
方法访问的项目。因此,如果您想删除或添加项目,您必须调用
replaceAll()
,然后添加和删除此
ExampleAdapter
实例上的项目,完成后,在其上调用
Editor
以将更改应用于 0x2415:
mAdapter.edit()
.remove(modelToRemove)
.add(listOfModelsToAdd)
.commit();
您以这种方式进行的所有更改都将一起批处理以提高性能。我们在上面章节中实现的
edit()
方法也存在于这个
edit()
对象上:
mAdapter.edit()
.replaceAll(mModels)
.commit();
如果您忘记调用
Editor
,那么您的任何更改都不会应用!
关于android - 如何使用 SearchView 过滤 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398247/
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
我有一个表student,其中的列dte_date(日期)具有值(2019-01-01、2019-02-01、2019-03-01)。 .等) 条件: dte_date 列中没有重复值。 但 dte_
我有一些逻辑可以根据不活动的用户创建通知。我正在获取具有以下属性的用户列表。我想做的只是在部门有非 Activity 用户时触发我的创建通知方法。因此,给出下面的列表,基本上会创建 1 个通知,表示部
使用 GPS 开发跟踪应用程序。一切都很好,但有时由于封闭区域或恶劣天气,我得到的分数不准确。当您绘制它们时,它看起来不对,有很多跃点/跳跃。 我应该运行什么算法来过滤掉不良信号对我来说,这看起来像是
我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码: class Joint { var position:Position
我想做的是在向量上创建一个过滤器,以便它删除未通过谓词测试的元素;但不太确定我该怎么做。 我根据谓词评估输入向量中的每个元素,例如在我的代码中,is_even 仿函数在 device_vector 向
我是 Gremlin 的新手,我正在使用 Gremlin 3.0.2 和 Stardog 5.0。我编写此查询是为了找出 schema.org 本体中两个实体之间的路径。以下是输出 - gremlin
考虑以下示例数据表, dt 30 的那一行需要去 - 或者如果其中两行 > 30相隔几秒钟,删除所有 3 个。然而 ,当我们有 4 行或更多行时,我们需要删除时间差 > 30 没有另一对 < 30
我正在考虑使用 ZeroMQ,并尝试了一些示例。但是,我无法验证 ZeroMQ 是否支持一些重要的要求。我希望你能帮助我。 我将使用这个简单的场景来问我的问题: 出版商(例如交易所)提供(大量)股票的
我需要从我的查询中过滤掉大量的对象。目前,它正在抓取类中的所有对象,我想将其过滤为查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我收到一个属性错误说明 ''QuerySet' object
如何在 Prometheus 查询中添加标签过滤器? kube_pod_info kube_pod_info{created_by_kind="ReplicaSet",created_by_name=
我有包含字符串的列的数据框,并希望过滤掉包含某些字符串以外的任何内容的所有行。考虑下面的简化示例: string % dplyr::filter(stringr::str_detect(string,
我有以下数据框,其中包含多行的角度变化值: 'data.frame': 712801 obs. of 4 variables: $ time_passed: int 1 2 3 4 5 6
我有一个 BehaviorSubject我希望能够filter ,但要保持新订阅者在订阅时始终获得一个值的行为主题式质量,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用 rxjs 的内置函数来
我有一个 RSS 提要,每天输出大约 100 篇文章。我希望过滤它以仅包含更受欢迎的链接,也许将其过滤到 50 个或更少。回到当天,我相信您可以使用“postrank”来做到这一点,但在谷歌收购后现已
我有这样一个重复的xml树- this is a sample xml file yellowred blue greyredblue 如您所见,每个项目可以具有不同数量的颜色标签
我以为我在 Haskell 学习中一帆风顺,直到... 我有一个 [[Int]] tiles = [[1,0,0] ,[0,1,0] ,[0,1,0]
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我在 mongoDB 中有这个架构: var CostSchema = new Schema({ item: String, value: Number }); var Attachm
给定一个数据框“foo”,我如何才能只选择“foo”中的那些行,例如foo$location =“那里”? foo = data.frame(location = c("here", "there",
我是一名优秀的程序员,十分优秀!