【问题标题】:How to remove duplicate data in list view with firebase android如何使用firebase android删除列表视图中的重复数据
【发布时间】:2018-03-23 20:04:02
【问题描述】:

** 已解决 **** 以下帖子中的解决方案 ******* 以下帖子中的解决方案 ******* ** p>

同学的我得到了一个关于如何解决如何使用 firebase 删除列表视图中的重复数据的问题。我只需要在列表视图中显示 1 个项目数据。 在屏幕截图中显示示例

实际代码:

  ArrayList<ShowCliente> myList = new ArrayList<>();

    final ArrayAdapter<ShowCliente> arrayAdapter = new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1, myList);

   newListView.setAdapter(arrayAdapter);
 gDatabase.child("cliente").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            ShowCliente show = dataSnapshot.getValue(ShowCliente.class);
            myList.add(show);
            //myList.clear();

            //*********************************
            arrayAdapter.notifyDataSetChanged();
            checkEmpty();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {


        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

最后尝试的代码:这是我今天尝试解决这个问题,任何不工作,发布给你知道:(

        //*************************************23/03/2018 **** **************** ATTEMP 1

    //VARIABLES
ArrayList<ShowCliente> myList = new ArrayList<>();
List<ShowCliente> myShow = new ArrayList<>();
ArrayList<ShowCliente> mList1 = new ArrayList<>(new HashSet<ShowCliente>(myList));
//HashSet<ShowCliente> myHash = new HashSet<>();

     //LEE TODOS DATOS DE LOS CHILD DE LA BASE DE DATOS
          ShowCliente show  = dataSnapshot.getValue(ShowCliente.class);
          //DISMINUIR A 1 LOS CLIENTES REPETIDOS EN LISTA
            Iterator<ShowCliente> iteShow = myList.iterator();
            while(iteShow.hasNext()){
                ShowCliente ite = iteShow.next();
                if(ite.equals(show)) iteShow.remove();
            }
            myList.add(show);

          //ShowCliente key = dataSnapshot.getKey();
          //mKeys.add(key);
          arrayAdapter.notifyDataSetChanged();
          checkEmpty();


    //****************************************************************** ATTEMP 2

    for(DataSnapshot shot : dataSnapshot.getChildren()){
                ShowCliente show = shot.getValue(ShowCliente.class);
                    String compare = String.valueOf(show.getRazonsoc());
                   if(show.getRazonsoc() != compare){
                       myList.add(show);
                   }
            }


    //****************************************** ATTEMP 3

       ShowCliente show = dataSnapshot.getValue(ShowCliente.class);
            //myList.clear();
            myList.add(show);
            if(myList.indexOf(show) == myList.lastIndexOf(show)){
                myList.clear();

            }

            arrayAdapter.notifyDataSetChanged();
            checkEmpty();      

   //************************************** ATTEMP 4

    ShowCliente show = dataSnapshot.getValue(ShowCliente.class);

            myShow.add(show);

            HashSet<ShowCliente> hashSet = new HashSet<>();
            hashSet.addAll(myShow);
            myShow.clear();
            myShow.addAll(hashSet);

   //************************************ ATTEMP 5 

             for(DataSnapshot shot : dataSnapshot.getChildren()){
                ShowCliente show = shot.getValue(ShowCliente.class);
                String value = show.getRazonsoc();
                stringList.clear();
                stringList.add(value);

            }

感谢您的 cmets 和解决方案

【问题讨论】:

  • 检查对象是否在您的列表中。
  • @Ibrahim 我需要删除不检查是否存在的数据
  • 请添加您当前的代码并删除您的其他编码尝试,目前还不清楚...
  • 而且我真的不知道您要做什么,如果您只想显示最后收到的项目,那么只需调用 myList.clear() 然后调用 myList.add(show)

标签: android firebase android-studio


【解决方案1】:

创建一个新列表,对旧列表执行 for 循环,对于旧列表中的每个项目,检查新列表 contains 是否为该项目,如果不是,则将其添加到新列表中。

如果您的模型上有一个好的hashCode 方法,则此方法有效,否则,您的两个相同对象可能具有不同的 hashCodes,从而使该技术(以及使用 hashCodes 的其他技术)无效。

在这种情况下,您要么必须覆盖模型的 hashCode,要么如果它们具有像 id 这样的唯一字段,请使用它来检查是否相等。 (在上面的 for 循环中,对于每个项目,在新列表上执行另一个 for 循环,并检查新列表中的所有项目是否不等于项目的 id,将其添加到列表中。)

【讨论】:

    【解决方案2】:

    解决方案(工作正常):

     @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data : dataSnapshot.getChildren()) {
                    ShowCliente show = data.getValue(ShowCliente.class);
                    myList.add(show);
                    System.out.println("Duplicate:"+myList);
                }
    
                for(int i=0; i < myList.size(); i++){
                    for(int j=0; j < myList.size(); j++){
                        if(myList.get(i).equals(myList.get(j))){
                            myList.remove(j);
                            //j;
                        }
                    }
                }
                arrayAdapter.notifyDataSetChanged();
                checkEmpty();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多