android - 使用可点击对象过滤回收站视图
问题描述
我有一个带有 CardView 的 RecycleView,它按行排列。单击任何行会打开一个与该行关联的新活动。在我将过滤器功能添加到此列表之前,一切都运行良好。当我搜索列表然后单击一项时,它不会执行与过滤结果相关的功能。
示例:原始列表:A、B、C、D、E
搜索:'B' 过滤结果:B
但是当我单击项目 B 时,它在项目 A 中起作用因为我有两个列表,一个是原始列表,一个是存储过滤列表的列表,如何制作过滤列表对象,能够执行更新原始列表/占据位置的功能原始列表对象。
searchdev.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
filter(editable.toString());
}});
public void filter (String search){
ArrayList<Devices> filteredList = new ArrayList<>();
for (Devices item : devicelist){
if (item.getDevicename().toLowerCase().contains(search.toLowerCase()))
{
filteredList.add(item);
}
}
DevAdapter.filterList(filteredList);
devicelist = filteredList;
}
点击功能:
DevAdapter.setOnItemClickListener(new ListAdapter.OnItemClickListener() {
@Override
public void onReturnClick(int position) {
String renter = devicelist.get(position).getRenter();
final String childpos = String.valueOf(position);
if( name.equals(renter)) // sesuai renter
{
Toast.makeText(RentActivity.this,"Device RETURNED",Toast.LENGTH_SHORT).show();
devicedb.child(childpos).child("codereturn").setValue("-");
devicedb.child(childpos).child("statusdb").setValue("0");
devicedb.child(childpos).child("statuscard").setValue("Available");
devicedb.child(childpos).child("renter").setValue("-");
devicelist.get(position).changeOnReturn("-","Available");
DevAdapter.notifyItemChanged(position);
}
else
{
Toast.makeText(RentActivity.this,"Not Eligible for Returning",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRentClick(int position) {
String checkstats=devicelist.get(position).getStatuscard();
final String childpos = String.valueOf(position);
if(checkconnection(RentActivity.this)) {
if (checkstats.equals("Available")) {
devicedb.child(childpos).child("codereturn").setValue("-");
devicedb.child(childpos).child("statusdb").setValue("1");
devicedb.child(childpos).child("statuscard").setValue("Rented");
devicedb.child(childpos).child("renter").setValue(name);
Toast.makeText(RentActivity.this,"Device Rent Success",Toast.LENGTH_SHORT).show();
devicelist.get(position).changeOnRent(name,"Rented");
DevAdapter.notifyItemChanged(position);
} else {
Toast.makeText(RentActivity.this, "Device not Available to Rent", Toast.LENGTH_SHORT).show();
}
}
else
{
Toast.makeText(RentActivity.this, "NO INTERNET ACCESS", Toast.LENGTH_SHORT).show();
}
}
});
和适配器:
@Override
public int getItemCount() {
return devlist.size();
}
public void filterList(ArrayList<Devices> filteredlist){
devlist = filteredlist;
notifyDataSetChanged();
}
解决方案
因为我有 2 个数组列表,即 ORIGINAL 和 FILTERED,所以我必须将 ORIGINAL 位置带到 FILTERED 一个,以便过滤列表指向原始列表的正确位置。
所以我在 orpos 变量中手动添加数据的原始位置:
public Devices(String orpos,String devname, String codedev, String renter, String statusdb, String statuscard, String img) {
this.oriposition = orpos;
this.devicename = devname;
this.codereturn = codedev;
this.renter = renter;
this.statusdb = statusdb;
this.statuscard = statuscard;
this.img = img;
}
在过滤器功能中,我制作了包含过滤列表的新适配器:
public void filter (final String search){
final ArrayList<Devices> filteredList = new ArrayList<>();
for (Devices item : devicelist){
if (item.getDevicename().toLowerCase().contains(search.toLowerCase()))
{
filteredList.add(item);
}
}
mRecyclerView = findViewById(R.id.devlist);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
DevAdapter = new ListAdapter(filteredList);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(DevAdapter);
DevAdapter.setOnItemClickListener(new ListAdapter.OnItemClickListener() {
@Override
public void onReturnClick(int position) {
int positionnew = Integer.parseInt(filteredList.get(position).getOriposition());
String renter = devicelist.get(positionnew).getRenter();
final String childpos = String.valueOf(positionnew);
...
我创建了一个名为 positionnew 的新变量,用原始列表数组编号覆盖过滤后的列表数组编号:
int positionnew = Integer.parseInt(filteredList.get(position).getOriposition());
推荐阅读
- sql - SQL Server 触发器卡在执行中
- datatrigger - Fancybox3:如何在保持数据触发器属性的同时在单个页面上创建单独的画廊?
- javascript - 如何将字符串数学运算符即“+”转换为数学运算符即+
- acumatica - Acumatica。我们如何将自己的图标添加到现代 UI?
- typescript - 如何扩展@types/express 请求接口?
- razor - 使用 RazorEngine 创建纯文本模板
- mongodb - 无法与 MongoDB 连接
- hibernate - Grails 升级到 3.3.x:无法使用 grails 3.3.5 访问 persistentEntity.relationshipMap 和 persistentEntity.hasOneMap
- javascript - CefSharp offscreen with .net core 2.0 Runtime Error , System.IO.FileNotFoundException: 'Could not load file or assembly 'CefSharp.Core,
- ruby-on-rails - 来自实时站点的令人兴奋的数据添加到 pgAdmin