如何从Firebase节点获取索引

时间:2018-11-25 13:12:55

标签: java android firebase firebase-realtime-database

我正在使用android应用程序,并且正在使用Firebase数据库, 该数据库显示了项目列表。

这是我的代码。

private DatabaseReference root;
ListView elementList;
ArrayAdapter<mdlItem> adapter;
ArrayList<mdlItem> itemsList;
Context context;

private void loadFireDataBase() {
    root = FirebaseDatabase.getInstance().getReference().child("Offers");
    root.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Add_Chat(dataSnapshot, "Add");
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Add_Chat(dataSnapshot, "Edit");
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Add_Chat(dataSnapshot , "Delete");
        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {


        }
    });
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    //Log.i(tag, "onCreateView");
    return creatList(inflater, container);
}

private View creatList(LayoutInflater inflater, @Nullable ViewGroup container) {
    loadFireDataBase();
    context = getActivity();
    itemsList = new ArrayList<mdlItem>();
    View view;
    view = inflater.inflate(R.layout.freg_main_content, container, false);
    elementList = (ListView) view.findViewById(R.id.customListView);
    Collections.sort(itemsList, new Comparator<mdlItem>() {
        @Override
        public int compare(mdlItem data1, mdlItem data2) {
            if (data1.getOfferIndex() > data2.getOfferIndex())
                return 1;
            else
                return 0;
        }
    });
    adapter = new offersArrayAdapter(context, R.layout.item_list_layout, itemsList);
    elementList.setAdapter(adapter);
    elementList.setOnItemClickListener(this);
    return view;
}

private void Add_Chat(DataSnapshot dataSnapshot, String theCase) {
    Map<String, Object> question = null;
    try {
        String theOfferCode = dataSnapshot.getKey();
        question = (Map<String, Object>) dataSnapshot.getValue();
        mdlItem mdl = new mdlItem();
        mdl.setOfferCode(theOfferCode);
        mdl.setRestCode(Integer.parseInt(String.valueOf(question.get("itemCode"))));
        mdl.setRestName(question.get("itmeName").toString());
        switch (theCase) {
            case "Add":
                itemsList.add(mdl);
                break;
            case "Delete":
                itemsList.remove(mdl);
                break;
            case "Edit":
                //??
                break;
        }
        adapter.notifyDataSetChanged();
    } catch (Exception ex) {
        Toast.makeText(context, ex.getMessage(), Toast.LENGTH_LONG).show();
    }
}

问题是当我执行Delete和Update时,无法通过'dataSnapshot'对象获得任何节点索引来控制列表。

另一件事是如何使用Add_Chat方法将mdl项添加到其他项列表的顶部。

我已经捕获了编辑,删除和添加数据库根目录,但是我无法控制如何以正确的方式使用这些事件

我想我需要获取“ dataSnapshot”对象以将其删除或对其进行更新,或者是否有其他解决方案

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

Firebase快照不是基于索引的。如果需要从数据库中的键到适配器中的索引的映射,则需要自己维护此映射。

有关此版本的简单版本,请查看FirebaseUI库中的FirebaseArray类。它维护阵列中当前所有快照的列表:

private final List<DataSnapshot> mSnapshots = new ArrayList<>();

然后在onChildAdded方法中添加,确定新项目在列表中的位置并将其添加:

public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildKey) {
    int index = 0;
    if (previousChildKey != null) {
        index = getIndexForKey(previousChildKey) + 1;
    }

    mSnapshots.add(index, snapshot);
    notifyOnChildChanged(ChangeEventType.ADDED, snapshot, index, -1);
}

它对所有其他onChild...方法都等效,因此它可以在需要时使用其getIndexForKey方法查找特定键的索引:

private int getIndexForKey(@NonNull String key) {
    int index = 0;
    for (DataSnapshot snapshot : mSnapshots) {
        if (snapshot.getKey().equals(key)) {
            return index;
        } else {
            index++;
        }
    }
    throw new IllegalArgumentException("Key not found");
}

答案 1 :(得分:0)

仅用于记录,这是正确的解决方案

  int index = -1;
            for (mdlItem item: itemsList) {
                if (item.getIndex() == mdl.getIndex()) {
                    index = itemsList.indexOf(item);
                }
            }