【问题标题】:Filtering Recycler View with Clickable Object使用可点击对象过滤回收站视图
【发布时间】:2019-01-09 13:11:09
【问题描述】:

我有一个带有 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();
}

【问题讨论】:

  • 要获取 recyclerview 适配器上的项目位置,请使用 getAdapterPosition() int pos = getAdapterPosition();
  • 您的仓位值会有所不同。确保将正确的适配器位置解析到点击处理程序。

标签: android android-recyclerview


【解决方案1】:

因为我有 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多