簡體   English   中英

使用可點擊對象過濾回收站視圖

[英]Filtering Recycler View with Clickable Object

我有一個帶有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個數組列表,分別是原始列表和已過濾列表,所以我必須將原始位置移到已過濾列表中,以便過濾后的列表指向原始列表的正確位置。

所以我手動在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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM