【问题标题】:Remove duplicates from ListView adapter从 ListView 适配器中删除重复项
【发布时间】:2019-05-24 16:43:44
【问题描述】:

我创建了许多数组适配器来从 Firebase 中过滤 ListView。每当我在 UI 上选择一个过滤器(“正在进行的任务”)时,它都会起作用,但是当我再次单击相同的过滤器(“正在进行的任务”)时,它会创建此列表的副本。我正在努力寻找具有类似背景的 SO 的答案。

任何帮助将不胜感激。

task_list.java

case R.id.inProgressStatus:

final ArrayList<String> filteredbyInProgress = new ArrayList<>();

final Query queryInProgress = FirebaseDatabase.getInstance().getReference("stores").child("Store 01").child("Task List")
                    .orderByChild("Status")
                    .equalTo("In-Progress");

final ArrayAdapter<String> arrayAdapter4 = new ArrayAdapter<String>(this, R.layout.tasks_layout, R.id.textTask, listTask);
            this.dbTasks.setAdapter(arrayAdapter4);

final ArrayAdapter<String> filterAdapter4 = new ArrayAdapter<String>(this, R.layout.tasks_layout, R.id.textTask, queryTask);
            this.dbTasks.setAdapter(filterAdapter4);


queryInProgress.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        //adding the key to an Arraylist to be referenced when deleting records
                        filteredbyInProgress.add(ds.getKey());
                        String name = ds.child("Name").getValue(String.class);

                        queryTask.add(name);
                    }

                    task_list.this.dbTasks.setAdapter(filterAdapter4);
                    arrayAdapter4.clear();
                    arrayAdapter4.notifyDataSetChanged();
                }

【问题讨论】:

    标签: java android listview android-arrayadapter


    【解决方案1】:

    在添加到列表之前确保没有重复值:

    queryInProgress.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    queryTask.clear();
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        //adding the key to an Arraylist to be referenced when deleting records
                        filteredbyInProgress.add(ds.getKey());
                        String name = ds.child("Name").getValue(String.class);
    
                        if (!queryTask.contains(value)) {
                          queryTask.add(value);
                        }
                    }
    
                    task_list.this.dbTasks.setAdapter(filterAdapter4);
                    filterAdapter4.notifyDataSetChanged();
                    arrayAdapter4.clear();
                    arrayAdapter4.notifyDataSetChanged();
                }
    

    【讨论】:

    • 对不起@faruk 这给了我和以前一样的结果
    • 为什么有两个适配器?为什么你 notifydatasetchanged() listTask 适配器不是 queryTask 适配器? @AlexBingham
    • 这可能听起来有点混乱,但一个适配器包含所有未查询的数据(arrayAdapter),第二个适配器(filterAdapter)是新查询的数据。 ArrayAdapter 也用于在每个编辑表单中访问数据。我希望这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多