使用Firebase中的数据创建ExpandableListView

如何解决使用Firebase中的数据创建ExpandableListView

我正在创建一个任务管理器应用程序。我在ExpandableListView显示这些任务时遇到了问题,因为每个任务都有子任务,所以我正在使用它。这是我的数据库结构:

Database Structure

ExpandableListView适配器可能工作良好。但是我在使用fillData()方法从firebase读取数据时遇到了问题。

ActivityExpandableListView

public class Tasks extends AppCompatActivity {

    ExpandableListView expandableListView;
    Customexpandablelistadapter expandablelistadapter;

    List<String> tasks;
    Map<String,List<String>> subtasks;

    private FirebaseDatabase firebasedatabase;
    private DatabaseReference databaseReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tasks);

        BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);
        bottomNav.setSelectedItemId(R.id.tasks);
        expandableListView = (ExpandableListView) findViewById(R.id.tasks_list);

        firebasedatabase = FirebaseDatabase.getInstance();
        databaseReference = firebasedatabase.getReference("Tasks");
        fillData();
        expandablelistadapter = new Customexpandablelistadapter(this,tasks,subtasks);
        expandableListView.setAdapter(expandablelistadapter);




        bottomNav.setonNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()){
                    case R.id.notes:
                        startActivity(new Intent(getApplicationContext(),Notes.class));
                        overridePendingTransition(0,0);
                        return true;
                    case R.id.tasks:
                        return true;
                    case R.id.goals:
                        startActivity(new Intent(getApplicationContext(),Goals.class));
                        overridePendingTransition(0,0);
                        return true;
                    case R.id.statistics:
                        startActivity(new Intent(getApplicationContext(),Statistics.class));
                        overridePendingTransition(0,0);
                        return true;
                    case R.id.add:
                        startActivity(new Intent(getApplicationContext(),Add.class));
                        overridePendingTransition(0,0);
                        return true;

                }
                return false;
            }
        });

    }

    public void fillData()
    {
        databaseReference.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(tasks.size() > 0) tasks.clear();
                for(DataSnapshot ds : dataSnapshot.getChildren())
                {
                  String taskName = (String) ds.child("Tasks").getValue();
                  tasks.add(taskName);
                }

                expandablelistadapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
}

ExpandableListView适配器:

public class Customexpandablelistadapter extends Baseexpandablelistadapter {

private Context context;
private List<String> listHeader;
private Map<String,List<String>> listChildren;
public Customexpandablelistadapter(Context context,List<String> listHeader,Map<String,List<String>> listChildren){
    this.context = context;
    this.listHeader = listHeader;
    this.listChildren = listChildren;
}

@Override
public int getGroupCount() {
    return this.listHeader.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return this.listChildren.get(listHeader.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
    return this.listHeader.get(groupPosition);
}

@Override
public Object getChild(int groupPosition,int childPosition) {
    return this.listChildren.get(this.listHeader.get(groupPosition));
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public long getChildId(int groupPosition,int childPosition) {
    return childPosition;
}

@Override
public boolean hasstableIds() {
    return false;
}

@Override
public View getGroupView(int groupPosition,boolean isExpanded,View convertView,ViewGroup parent) {
    String header = (String) getGroup(groupPosition);

    if(convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_view_header,null);
    }

    TextView headerOfGroup = (TextView) convertView.findViewById(R.id.header_text);
    headerOfGroup.setText(header);
    return convertView;
}

@Override
public View getChildView(int groupPosition,int childPosition,boolean isLastChild,ViewGroup parent) {
    String child = (String) getChild(groupPosition,childPosition);

    if(convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_view_child,null);
    }

    TextView childText = (TextView) convertView.findViewById(R.id.child_text);
    childText.setText(child);
    return convertView;
}

@Override
public boolean isChildSelectable(int groupPosition,int childPosition) {
    return true;
}

}

解决方法

据我所知,您问题中的相关代码为:

firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if(tasks.size() > 0) tasks.clear();
        for(DataSnapshot ds : dataSnapshot.getChildren())
        {
          String taskName = (String) ds.child("Tasks").getValue();
          tasks.add(taskName);
        }

        expandableListAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

您的代码将一个侦听器附加到/Tasks,然后遍历其子节点,并获得每个子节点的Tasks子节点。但是,如果我们查看您的数据库结构,则每个任务下都没有Tasks子节点。这样一来,可能会为/Tasks

的每个子节点生成一个空项目列表

如果要显示/Tasks的每个子节点的键(因此在屏幕截图中显示make a aolicationShoping),则需要使用getKey()每个子节点的数量:

firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if(tasks.size() > 0) tasks.clear();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String taskName = ds.getKey();
            tasks.add(taskName);
        }

        expandableListAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()
    }
});

如果要显示每个子节点的Subtasks下的所有值,则需要为此添加另一个嵌套循环:

firebasedatabase = FirebaseDatabase.getInstance();
databaseReference = firebasedatabase.getReference("Tasks");
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if(tasks.size() > 0) tasks.clear();
        for(DataSnapshot taskSnapshot: dataSnapshot.getChildren()) {
            DataSnapshot subtasksSnapshot = taskSnapshot.child("Subtasks");
            for(DataSnapshot subtaskSnapshot: subtasksSnapshot.getChildren()) {
                String taskName = subtaskSnapshot.getValue(String.class);
                tasks.add(taskName);
            }
        }

        expandableListAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException()
    }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?