gpt4 book ai didi

Android:如何在 RecyclerView 列表中维护 CardView 的 View ?

转载 作者:行者123 更新时间:2023-11-30 00:44:58 25 4
gpt4 key购买 nike

我有一个显示 CardView 垂直列表的 RecyclerView 列表。 AppBar 有一个 action_search MenuItem,它在单击时处理 SearchView 方法。 SearchView 运行一个过滤方法,允许搜索 CardView 数据。

我设置了一个 filterList 来保存从搜索结果中筛选出的 CardView。 filter() 方法在执行搜索查询之前清除 filterList。问题是 filterList.clear() 破坏了现有 RecyclerView CardView 的 View ,UI 恢复为空白的 RecyclerView 布局。

如果我从应用程序中退出按钮然后重新启动应用程序,RecyclerView 会正确加载 CardViews,当我单击搜索菜单项时,我就可以正确搜索;即 View 动态且正确地更新以仅显示与搜索文本查询匹配的那些 CardView。我在这里缺少什么?

MainActivity.java

public class MainActivity extends AppCompatActivity implements
RecyclerItemClickListener {

private MyRecylerAdapter adapter;
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.cardview_menu, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView item);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
adapter.filter(query);
return true;
}

@Override
public boolean onQueryTextChange(String newText) {
adapter.filter(newText);
return true;
}
});
return;
}

Adapter.java

public class MyRecylerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private List<ListItem> listItems, filterList;
private Context mContext;

public MyRecylerAdapter(Context context, List<ListItem> listItems) {
this.listItems = listItems;
this.mContext = context;
this.filterList = new ArrayList<>();
// Copy the original list to the filter list to be used for setting row
// values when returning search data items.
this.filterList.addAll(this.listItems);
}

public void clear() {
while (getItemCount() > 0) {
remove(getItem(0));
}
}

public void filter(final String text) {

new Thread(new Runnable() {
@Override
public void run() {

filterList.clear();

if(TextUtils.isEmpty(text)) {
filterList.addAll(listItems);
} else {
for (ListItem item : listItems) {
if (item.getTodo().toLowerCase().contains(text.toLowerCase())) {
filterList.add(item);
}
}
}

// Set on UI Thread
((Activity) mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}).start();
}

最佳答案

试试这个代码..在适配器中设置这个方法

public void setFilter(ArrayList<ListItem> listItem) {
listItems = new ArrayList<>();
listItems.addAll(listItem);
notifyDataSetChanged();
}

并在 onQueryTextChange() 中这样使用

final ArrayList<ListItem> filteredModelList = filter(listItems, newText);
adapter.setFilter(filteredModelList);

这是过滤方法。

private ArrayList<ListItem> filter(ArrayList<ListItem> models, String query) {
query = query.toLowerCase();

final ArrayList<ListItem> filteredModelList = new ArrayList<>();
for (ListItem model : models) {
final String text = model.getTodo().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}

return filteredModelList;
}

并从适配器构造函数中删除最后两行。使用此代码,您不必为过滤器创建第二个数组列表对象,因此您不需要清除数组列表对象。当您在搜索 View 中写入或清除文本时,它会很好用。

关于Android:如何在 RecyclerView 列表中维护 CardView 的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com