情况:我在列表视图中有一个类列表。它工作正常。我可以在这样的列表中检索类:
English
Math
French
这是类的数据库:
现在,当点击列表项时,我想显示该类的部分,因此当我单击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
,就像在代码中一样。
答案 0 :(得分:0)
看起来您对listclasses
的值进行了硬编码,然后使用该值查询Class
之一,这就是为什么您可能会有多个孩子的原因。这是因为有两个孩子根据您的屏幕截图包含classname
相同的值。
您必须将侦听器附加到Class
节点,然后根据数据库的值填充listclasses
,然后将OnClickListener
或OnLongItemClickListener
设置为每个节点其中显示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()'
}
});