如何从重复的名称中获取一个值?

时间:2017-12-04 17:03:06

标签: android firebase firebase-realtime-database

情况:我在列表视图中有一个类列表。它工作正常。我可以在这样的列表中检索类:

English
Math
French

这是类的数据库:

enter image description here

现在,当点击列表项时,我想显示该类的部分,因此当我单击English列表项时,应该显示该类的部分的警告对话框。我能够这样做:

listclasses.setLongClickable(true);

listclasses.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        final String selectedFromList = (String) listclasses.getItemAtPosition(position);
        final DatabaseReference retrieve = FirebaseDatabase.getInstance().getReference().child("Class");
        retriev.orderByChild("Classname").equalTo(selectedFromList).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){

                    String key=data.getKey();

                    DatabaseReference referes=FirebaseDatabase.getInstance().getReference().child("Class");
                    referes.orderByKey().equalTo(key).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for(DataSnapshot datas: dataSnapshot.getChildren()){

                            String section=datas.child("section").getValue().toString();

                            LayoutInflater li = LayoutInflater.from(StudentSearchActivity.this); //inflate converts xml to a view object to use in code
                            View promptsView = li.inflate(R.layout.info, null); //two parameters, the xml and the root(null means the layout is a child of viewgroup

                            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                    StudentSearchActivity.this); /*alertdialog.builder class,creates a builder for alert dialog, parameter is context */

                            alertDialogBuilder.setView(promptsView);
                            final TextView sections = (TextView) promptsView.findViewById(R.id.sections);
                            sections.setText(section);
                            alertDialogBuilder.setCancelable(true); //true can be canceled with back key
                            alertDialogBuilder.setPositiveButton("Ok",
                                    new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int id) {
                                            dialog.dismiss();
                                        }
                                    });
                            AlertDialog alertDialog = alertDialogBuilder.create(); //creates alert dialog from builder
                            alertDialog.show();
                        }}

问题:当我有相同的类名示例English但是每个都在一个部分中时,我会在长按项目时得到两个部分。示例:

第1步:长按English项目。

步骤2:警告对话框,显示部分:503。

步骤3:在按下或按ok时,会出现另一个警告对话框,其中包含部分:402。

所以这两个部分都出现在一个类的长按上,因为它的名称相同,但这是错误的。只有该英语课的部分应该出现,然后当点击其他英语课时,该英语课的部分也应该只出现。这可以在Firebase中解决吗?

我正在使用addListenerForSingleValueEvent,并且在数据库中也是Classname,就像在代码中一样。

1 个答案:

答案 0 :(得分:0)

看起来您对listclasses的值进行了硬编码,然后使用该值查询Class之一,这就是为什么您可能会有多个孩子的原因。这是因为有两个孩子根据您的屏幕截图包含classname相同的值。

您必须将侦听器附加到Class节点,然后根据数据库的值填充listclasses,然后将OnClickListenerOnLongItemClickListener设置为每个节点其中显示AlertDialog具有自己的section值。

这是解决方案

// to store the class's value
List<Class> classes = new ArrayList<>();

// to retrieve the list of class from the database
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Class");
ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Class class = dataSnapshot.getValue(Class.class);
        classes.add(class);

        ... add 'class.getClassName()' to the listclasses adapter
    }
});

// add the OnItemLongClickListener
listclasses.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView <<?>parent, View view, int position, long id) {
        Class selectedClass = classes.get(position);

        ... show an AlertDialog with the value of 'selectedClass.getSection()'
    }
});